如何使用Mocha和Supertest发送格式错误的JSON?

Bla*_*her 2 json mocha.js node.js supertest

我有当前要运行的测试:

var request = require('supertest');

it('should be malformed json', function(done) {
  request(config.base)
    .post('/authenticate')
    .send('{"project":{"description":\'test"}}')
    .set('Authorization', 'Bearer ' + config.token)
    .expect('Content-Type', /json/)
    .expect(status.BAD_REQUEST);
});
Run Code Online (Sandbox Code Playgroud)

然而,超级测试似乎验证了它,它只是在正文中发送“{}”。知道我该如何解决这个问题吗?

Ita*_*Ale 5

您将一个字符串传递给该send方法,因此它将按原样发送到服务器(您可以在那里编写任何内容!)。

服务器收到字符串后,会解析 JSON 并找到错误。接下来发生的情况取决于服务器应用程序的配置方式(或您正在使用的框架)。在这种情况下,服务器可能会忽略任何格式错误的 JSON 输入,因此就像您在/authenticate没有任何输入的情况下调用一样。

TL;DR:send()只发送您传递的任何字符串。如果您想引发错误,您需要修改服务器,而不是测试套件。

编辑

我又做了一些挖掘。首先,正如我之前所说,send()确实让字符串保持原样。从代码中可以看到: https: //github.com/visionmedia/superagent/blob/master/lib/client.js#L778

因此,您没有告诉服务器请求正文是 JSON 格式,因此您所说的内容被解释为“text/plain”并且不会被解析。要传递手动 JSON 字符串,send()您还需要指定请求的内容类型:

request(config.base)
    .post('/authenticate')
    .type('json')
    .send('{"project":{"description":\'test"}}')
//...
Run Code Online (Sandbox Code Playgroud)