2015-02-02 6 views
9

Я хотел бы проверить, как REST API обрабатывает запрос POST с телом с недействительным синтаксисом JSON, например отсутствующей запятой. Я использую node.js для написания тестов API. Я использую frisby, но я также пробовал supertest. Не повезло. С помощью предыдущих инструментов вы передаете тело запроса как объект JavaScript, так что это не выход. Я также попытался передать недопустимый JSON как строку без везения, так как строка также действительна JSON (пример ниже). Есть идеи?Протестируйте, как API обрабатывает недействительный тело запроса синтаксиса JSON, используя node.js

frisby.create('Ensure response has right status') 
    .post('http://example.com/api/books', '{"invalid"}', {json: true}) 
    .expectStatus(400) 
    .toss(); 
+0

Не могли бы вы привести примеры строки и объектов, которые вы использовали? – Demurgos

+0

@Demurgos Добавлен пример, спасибо. – alefteris

+1

Если вам нужен этот тест, должна быть ситуация, когда вы ожидаете, что эта ошибка может возникнуть. Можете ли вы предоставить сценарий при возникновении этой ошибки? – freele

ответ

4

Используя Supertest и мокко пакетов, вы можете проверить конечную точку, разместив недопустимый JSON как это:

var request = require('supertest'); 

describe('Adding new book', function(){ 
    it('with invalid json returns a 400', function(done){ 
    request('http://example.com').post('/api/books') 
     .send('{"invalid"}') 
     .type('json') 
     .expect('Content-Type', /json/) 
     .expect(400) 
     .end(function(err, res) { 
      console.log(res.error); 
      done(); 
     }); 
    }); 
}); 

Важный бит здесь type(json). Это установит Content-Type запроса в application/json. Без этого supertest/superagent по умолчанию отправит строки как application/x-www-form-urlencoded. Также недопустимый JSON предоставляется как строка, а не как объект JavaScript.

3

Я никогда не использовал Фрисби или SuperAgent, но я считаю, есть два вопроса:

1. passing an invalid JSON from client to server using POST method.

Что не представляется возможным, потому что она в скором времени будет отклонена на самой стороне клиента, и вы получит сообщение об ошибке перед отправкой запроса POST на сервер. (Потому как есть только строки при работе с HTTP, клиент сам будет пытаться stringify в JSON, где он будет застревать с недопустимой JSON)

2. pass an invalid JSON just as a string

пример: POST строку, как это с помощью JQuery

$.post("demo_test_post.asp", 
    { 
     name: 'pqr:{"abc":"abc",}' // see there is a comma at the end making JSON invalid 
    }, 
    function(data, status){ 
     alert("Data: " + data + "\nStatus: " + status); 
    }); 

Это эффективно передаст недействительный JSON (имя в этом случае) на сервер в виде srting. Но это потребует от вас разобрать строку в JSON, используя JSON.parse(), прежде чем вы сможете ее использовать. И когда вы пытаетесь что вы получите это:

SyntaxError: Unexpected token p at Object.parse (native) at Object.app.get.res.send.data [as handle] (/home/ubuntu/workspace/TapToBook.js:35:19) at next_layer (/home/ubuntu/workspace/node_modules/express/lib/router/route.js:103:13) at Route.dispatch (/home/ubuntu/workspace/node_modules/express/lib/router/route.js:107:5) at proto.handle.c (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:195:24) at Function.proto.process_params (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:251:12) at next (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:189:19) at Layer.staticMiddleware [as handle] (/home/ubuntu/workspace/node_modules/express/node_modules/serve-static/index.js:55:61) at trim_prefix (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:226:17) at proto.handle.c (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:198:9)

Так какие пакеты, которые вы используете для Rest, вы можете передать недопустимый JSON в виде строки, но не использовать его.

+0

Спасибо за ваш ответ. Я бы предпочел, чтобы ответ был как функциональный тест, хотя с одним из пакетов, упомянутых в вопросе. С тех пор я понял, как это сделать, по крайней мере, по крайней мере. – alefteris

+0

@alefteris. Без проблем приятель –

1

Я предполагаю, что ваш тест хочет проверить, что сервер обрабатывает недействительный JSON (и не сбой). Надеюсь, вы получите 400 плохих запросов.

Поскольку POST в http - это просто строка, опция для тестирования - использовать API, который требует, чтобы вы предоставили объект JSON.

Если вы используете необработанный узел HTTP, то вы можете отправить любую неверную строку вы хотите:

How to make an HTTP POST request in node.js?

Там также популярная библиотека запроса.

https://github.com/request/request

Например, с библиотекой, ваш тест может подобрать недопустимое содержимое из файла и записи или ставить. Из них документы:

fs.createReadStream('file.json').pipe(request.put('http://example.com/obj.json')) 
+0

Спасибо, что ответили. Я не думал об использовании пакета запроса непосредственно в тестах. Я бы предпочел, хотя, если бы пример кода в ответе был полным рабочим функциональным тестом, желательно с использованием внешнего файла для хранения недействительного JSON.I выяснил, как это сделать с помощью супертеста/суперагента, но API запросов не кажется очень другой, поэтому можно было бы сделать это с этим, как я полагаю. – alefteris

 Смежные вопросы

  • Нет связанных вопросов^_^