使用带有 Gauge 的 frisby.js/jest 测试 API
Testing API using frisby.js/jest with Gauge
我正在尝试让 gauge-js 与 Frisby 一起工作。我们 运行 使用 Frisby 作为黑盒测试对我们的 API 进行功能测试。最近将 Frisby 升级到现在使用 Jest 的 2.0.8 版。一切都很好。现在我想在上面添加 Gauge-js 以添加人类可读的 test-specs/scenarios/steps。
我正在 Windows 8.1 机器上测试:
- Frisby
- Gauge 0.9.4
- gauge-js 2.0.3
为了让它工作,我将 Frisby 添加为 gauge-js 的依赖项。
现在它部分起作用了。它实际执行测试步骤,但失败
ReferenceError: expect is not defined
at incrementAssertionCount (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js.0.3\node_modules\frisby\src\frisby\expects.js:14:20)
at FrisbySpec.status (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js.0.3\node_modules\frisby\src\frisby\expects.js:23:5)
at FrisbySpec._addExpect.e (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js.0.3\node_modules\frisby\src\frisby\spec.js:396:23)
at FrisbySpec._runExpects (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js.0.3\node_modules\frisby\src\frisby\spec.js:288:24)
at _fetch.fetch.then.then (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js.0.3\node_modules\frisby\src\frisby\spec.js:142:14)
at process._tickCallback (internal/process/next_tick.js:109:7)
实际测试步骤如下:
/* globals gauge*/
"use strict";
var frisby = require('frisby');
// --------------------------
// Gauge step implementations
// --------------------------
step("Get responds with <state>.", function (state, doneFn) {
frisby
.timeout(1500)
.get('http://localhost:8001/some/get/resource', {
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic QWERTYASDFEDEFTGHYFVCCFRJgyuku'
}
})
// .expect('status', 200)
// .expect('header', 'Content-Type', 'application/json; charset=utf-8')
// .expect('json', state)
.done(doneFn).catch(error => {
console.log(error);
});
});
当注释掉的行取消注释时发生错误。
我认为问题实际上在于它的加载依赖关系,但我的 js 知识有点零散和生疏。任何帮助,将不胜感激。
.expect(...)
函数未定义的原因是 frisby 期望 jasmine 是测试运行器,并且 jasmine 的 expect
函数可供它使用。
frisby 包含的所有 expect
函数执行以下 "incrementAssertionCount"。因为它在 if (_.isFunction(expect))
中找不到 expect
,所以无法提供 frisby 会提供的默认期望。
function incrementAssertionCount() {
if (_.isFunction(expect)) { // FAILS HERE: 'expect' does not exist
// Jasmine
expect(true).toBe(true);
}
}
看起来有一个简单的替代方法,就是将 frisby 中的 expect 函数复制到您的代码中并调用 addExpectHandler
方法(更好的是,制作一个您可以引用的外部包,这样您就不会不必将其复制到每个项目中)。
一个简单的例子如下所示:
var frisby = require("frisby");
var assert = require("assert");
function statusHandler(response, statusCode) {
assert.strictEqual(response.status, statusCode, `HTTP status ${statusCode} !== ${response.status}`);
}
beforeScenario(function () {
frisby.addExpectHandler('status', statusHandler);
});
step("Call httpbin.org and get a teabot", function (done) {
frisby.get('http://httpbin.org/status/418')
.timeout(2000)
.expect('status', 418)
.catch(function (e) {
done(e);
})
.done(done);
});
我找到了解决原始问题的更好方法。当我开始实施@duyker 建议时。我注意到(最后)Frisby 代码有意忽略对 Jasmine 的依赖,如果它不存在,但有一个错误。所以我提交了一个fix for it。它被接受了。
现在问题已解决,Frisby 可以在没有 Jasmine 或 Jest 的情况下工作。
我正在尝试让 gauge-js 与 Frisby 一起工作。我们 运行 使用 Frisby 作为黑盒测试对我们的 API 进行功能测试。最近将 Frisby 升级到现在使用 Jest 的 2.0.8 版。一切都很好。现在我想在上面添加 Gauge-js 以添加人类可读的 test-specs/scenarios/steps。
我正在 Windows 8.1 机器上测试:
- Frisby
- Gauge 0.9.4
- gauge-js 2.0.3
为了让它工作,我将 Frisby 添加为 gauge-js 的依赖项。 现在它部分起作用了。它实际执行测试步骤,但失败
ReferenceError: expect is not defined
at incrementAssertionCount (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js.0.3\node_modules\frisby\src\frisby\expects.js:14:20)
at FrisbySpec.status (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js.0.3\node_modules\frisby\src\frisby\expects.js:23:5)
at FrisbySpec._addExpect.e (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js.0.3\node_modules\frisby\src\frisby\spec.js:396:23)
at FrisbySpec._runExpects (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js.0.3\node_modules\frisby\src\frisby\spec.js:288:24)
at _fetch.fetch.then.then (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js.0.3\node_modules\frisby\src\frisby\spec.js:142:14)
at process._tickCallback (internal/process/next_tick.js:109:7)
实际测试步骤如下:
/* globals gauge*/
"use strict";
var frisby = require('frisby');
// --------------------------
// Gauge step implementations
// --------------------------
step("Get responds with <state>.", function (state, doneFn) {
frisby
.timeout(1500)
.get('http://localhost:8001/some/get/resource', {
headers: {
'Content-Type': 'application/json',
'Authorization': 'Basic QWERTYASDFEDEFTGHYFVCCFRJgyuku'
}
})
// .expect('status', 200)
// .expect('header', 'Content-Type', 'application/json; charset=utf-8')
// .expect('json', state)
.done(doneFn).catch(error => {
console.log(error);
});
});
当注释掉的行取消注释时发生错误。
我认为问题实际上在于它的加载依赖关系,但我的 js 知识有点零散和生疏。任何帮助,将不胜感激。
.expect(...)
函数未定义的原因是 frisby 期望 jasmine 是测试运行器,并且 jasmine 的 expect
函数可供它使用。
frisby 包含的所有 expect
函数执行以下 "incrementAssertionCount"。因为它在 if (_.isFunction(expect))
中找不到 expect
,所以无法提供 frisby 会提供的默认期望。
function incrementAssertionCount() {
if (_.isFunction(expect)) { // FAILS HERE: 'expect' does not exist
// Jasmine
expect(true).toBe(true);
}
}
看起来有一个简单的替代方法,就是将 frisby 中的 expect 函数复制到您的代码中并调用 addExpectHandler
方法(更好的是,制作一个您可以引用的外部包,这样您就不会不必将其复制到每个项目中)。
一个简单的例子如下所示:
var frisby = require("frisby");
var assert = require("assert");
function statusHandler(response, statusCode) {
assert.strictEqual(response.status, statusCode, `HTTP status ${statusCode} !== ${response.status}`);
}
beforeScenario(function () {
frisby.addExpectHandler('status', statusHandler);
});
step("Call httpbin.org and get a teabot", function (done) {
frisby.get('http://httpbin.org/status/418')
.timeout(2000)
.expect('status', 418)
.catch(function (e) {
done(e);
})
.done(done);
});
我找到了解决原始问题的更好方法。当我开始实施@duyker 建议时。我注意到(最后)Frisby 代码有意忽略对 Jasmine 的依赖,如果它不存在,但有一个错误。所以我提交了一个fix for it。它被接受了。
现在问题已解决,Frisby 可以在没有 Jasmine 或 Jest 的情况下工作。