如何使用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"}}')
//...
我有我想要的当前测试运行:
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"}}')
//...