我在使用Frisby.js API testing framework进行新测试时遇到了一些麻烦。
对于上下文,我已经编写了一些其他不需要从磁盘读取参考文件的测试,并运行了Frisby附带的一些示例,并且它们都运行得非常快速和准确。真的很喜欢到目前为止的执行速度。看到所有这些都回来了,我相当肯定我的环境是合理的。
下面是一个有问题的JavaScript文件的简化版本,我通过jasmine-node运行:
var frisby = require('frisby');
var fs = require('fs');
var path = require('path');
var URL = 'http://server/api/';
var getJSON = fs.readFileSync(path.resolve(__dirname, 'GET.json'), 'utf-8').replace(/^\uFEFF/, ''); // the .replace removes the BOM from the start of the file
console.log(getJSON); // this dumps the file contents to the screen, no problems here
frisby.create('GET from API')
.get(URL + 'Endpoint?Parameters=Values')
.expectStatus(200) // tests that HTTP Status code equals expected 200, still no worries
.expectJSON(getJSON) // this is where the 'undefined' error is thrown
.toss();
从命令行运行测试非常简单:
C:\Testing\Frisby> jasmine-node apitest.js
我相信我以正确的顺序做事,读取同步文件,然后是Frisby调用,但是在执行时它会抛出以下错误:
Failures:
1) Frisby Test: GET from API
[ GET http://server/api/Endpoint?Parameters=Values ]
Message:
TypeError: Expected valid JavaScript object to be given, got undefined
Stacktrace:
TypeError: Expected valid JavaScript object to be given, got undefined
at _jsonContains (C:\Users\jlucktay\AppData\Roaming\npm\node_modules\frisby\lib\frisby.js:1182:11)
at jasmine.Matchers.toContainJson (C:\Users\jlucktay\AppData\Roaming\npm\node_modules\frisby\lib\frisby.js:1141:12)
at null.<anonymous> (C:\Users\jlucktay\AppData\Roaming\npm\node_modules\frisby\lib\frisby.js:686:24)
at null.<anonymous> (C:\Users\jlucktay\AppData\Roaming\npm\node_modules\frisby\lib\frisby.js:1043:43)
at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)
Finished in 0.292 seconds
1 test, 2 assertions, 1 failure, 0 skipped
我通过npm全局安装了jasmine-node和frisby软件包,并使用npm link frisby
创建了从我的测试目录到%APPDATA%\ npm的相应联结。
我还尝试更改代码,在回调中使用fs.readFile
代替fs.readFileSync
和frisby调用,但仍然遇到同样的问题。
正如我上面所说,我的其他测试和Frisby附带的样本运行并且没有错误地返回。具体来说,httpbin_binary_post_put_spec.js
示例使用的代码几乎与我自己编写的代码完全相同,并且该示例的工作正常。
我已经通过Fiddler路由了HTTP请求,可以看到请求和响应,一切看起来都很好。它获取HTTP 200并且响应主体具有我想要与文件内容进行比较的预期JSON。
为什么我收到有关未定义对象的错误?
答案 0 :(得分:2)
需要将字符串转换为适当的JSON对象:
.expectJSON(getJSON)
- &gt; .expectJSON(JSON.parse(getJSON))