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

How to use Mocha and Supertest to send malformed JSON?

我有我想要的当前测试运行:

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);
});

然而,supertest 似乎验证了它,它只是在正文中发送'{}'。知道如何解决这个问题吗?

您正在将字符串传递给 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"}}')
//...