我想测试REST API如何处理具有无效JSON语法的主体的POST请求,例如缺少逗号 . 我'm using node.js to write the API tests. I' m使用frisby但我也试过supertest . 没运气 . 使用以前的工具,您将请求主体作为JavaScript对象传递,因此不行 . 我还尝试将无效的JSON作为字符串传递而没有任何运气,因为字符串也是有效的JSON(下面的示例) . 有任何想法吗?
frisby.create('Ensure response has right status')
.post('http://example.com/api/books', '{"invalid"}', {json: true})
.expectStatus(400)
.toss();
3 回答
使用supertest和mocha包,您可以通过发布无效的JSON来测试 endpoints ,如下所示:
这里重要的是
type(json)
. 这会将请求的Content-Type设置为application / json . 有了它,supertest / superagent将默认发送字符串作为application / x-www-form-urlencoded . 此外,无效的JSON是作为字符串提供的,而不是作为JavaScript对象提供的 .我从未使用过Frisby或superagent,但我发现这里有两个问题:
这是不可能的,因为它很快就会在客户端被拒绝,并且在向服务器发出POST请求之前会收到错误 . (因为在使用http时只有字符串,客户端本身会尝试将JSON字符串化,因为它会被无效的JSON卡住)
示例:使用JQuery POST这样的字符串
这将有效地将无效的JSON(在本例中为名称)作为srting传递给服务器 . 但这需要您使用
JSON.parse()
将字符串解析为JSON,然后才能使用它 . 当你尝试时,你会得到这个:因此,无论您使用哪个包 Rest ,都可以将无效的JSON作为字符串传递,但不能使用它 .
我假设你的测试想要验证服务器正在处理无效的JSON(并且不会崩溃) . 希望返回400坏请求 .
由于http中的POST只是一个字符串,因此测试的一个选项是使用需要您提供JSON对象的API .
如果您使用原始节点http,那么您可以发送您想要的任何无效字符串:
How to make an HTTP POST request in node.js?
还有流行的请求库 .
https://github.com/request/request
例如,对于库,您的测试可能会从文件中拾取无效内容并进行发布或放置 . 从他们的文档: