我在使用Frisby.js API testing framework进行新测试时遇到了一些麻烦。

就上下文而言,我编写了其他一些不需要从磁盘读取参考文件的测试,并且运行了Frisby随附的一些示例,它们都非常快速,准确地运行。到目前为止,真的很喜欢执行速度。看到一切恢复正常后,我可以肯定我的环境很好。

以下是我通过jasmine-node运行的有问题的JavaScript文件的简化版本:

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的适当连接。

我也尝试过更改代码,以在回调内部的frisby调用中使用fs.readFile而不是fs.readFileSync,但是仍然存在相同的问题。

就像我上面说的,我的其他测试以及Frisby随附的示例可以正常运行并返回。具体来说,httpbin_binary_post_put_spec.js示例使用与我最终编写的代码几乎相同的代码,并且该示例工作正常。

我已经通过Fiddler路由了HTTP请求,并且可以看到请求和响应,并且在那里一切正常。它获取一个HTTP 200,并且响应主体具有我想与文件内容进行比较的预期JSON。

为什么我收到有关未定义对象的错误?

最佳答案

解决橡皮鸭问题似乎使我摆脱了自己的愚蠢。

需要将字符串转换为正确的JSON对象:

.expectJSON(getJSON)-> .expectJSON(JSON.parse(getJSON))

关于javascript - Frisby.js:期望提供有效的JavaScript对象,未定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24772356/

10-09 17:24