Проверьте, как API обрабатывает недействительный тело запроса синтаксиса JSON, используя node.js

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

frisby.create('Ensure response has right status')
    .post('http://example.com/api/books', '{"invalid"}', {json: true})
    .expectStatus(400)
    .toss();
+9
источник поделиться
3 ответа

Используя пакеты supertest и mocha, вы можете протестировать конечную точку, разместив недопустимый 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.

+4
источник

Я никогда не использовал Фризби или суперагента, но я нахожу здесь два вопроса:

1. передача недопустимого JSON с клиента на сервер с использованием метода POST.

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

2. передать недействительный JSON как строку

example: 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(), прежде чем вы сможете ее использовать. И когда вы попробуете это, вы получите следующее:

СинтаксисError: Неожиданный токен p в Object.parse (родной) в Object.app.get.res.send.data [as handle] (/home/ubuntu/workspace/TapToBook.js:35:19) в next_layer (/home/ubuntu/workspace/ node_modules/express/lib/router/route.js:103:13) в Route.dispatch(/home/ubuntu/workspace/node_modules/express/lib/router/route.js:107:5) на proto.handle.c(/home/ubuntu/workspace/node_modules/express/lib/router/index.js:195:24) в Function.proto.process_params (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:251:12) на следующий (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:189:19) на Layer.staticMiddleware [в качестве дескриптора] (/home/ubuntu/workspace/node_modules/express/node_modules/serve-static/index.js:55:61) в trim_prefix (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:226:17) на proto.handle.c(/home/ubuntu/workspace/node_modules/express/lib/router/index.js:198:9)

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

+3
источник

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

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

Если вы используете raw node http, то вы можете отправить любую недопустимую строку:

Как сделать запрос HTTP POST в node.js?

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

https://github.com/request/request

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

fs.createReadStream('file.json').pipe(request.put('http://example.com/obj.json'))
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос