0

我正在尝试让 Gauge-js 与 Frisby 一起工作。我们使用 Frisby 在我们的 API 上运行功能测试作为黑盒测试。最近将 Frisby 升级到现在使用 Jest 的 2.0.8 版本。一切都很好。现在我想在顶部添加 Gauge-js 以添加人类可读的测试规范/场景/步骤。

我正在 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\2.0.3\node_modules\frisby\src\frisby\expects.js:14:20)
    at FrisbySpec.status (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js\2.0.3\node_modules\frisby\src\frisby\expects.js:23:5)
    at FrisbySpec._addExpect.e (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js\2.0.3\node_modules\frisby\src\frisby\spec.js:396:23)
    at FrisbySpec._runExpects (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js\2.0.3\node_modules\frisby\src\frisby\spec.js:288:24)
    at _fetch.fetch.then.then (C:\Users\<USER>\AppData\Roaming\gauge\plugins\js\2.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 知识有点零散和生疏。任何帮助,将不胜感激。

4

2 回答 2

0

函数未定义的原因.expect(...)是 frisby 期望 jasmine 是测试expect运行器,并且可以使用来自 jasmine 的函数。

frisby 包含的所有expect函数都执行下面的“incrementAssertionCount”。expect因为它在 中找不到if (_.isFunction(expect)),所以它无法提供 frisby 将提供的默认期望。

function incrementAssertionCount() {
  if (_.isFunction(expect)) { // FAILS HERE: 'expect' does not exist
    // Jasmine
    expect(true).toBe(true);
  }
}

似乎有一个简单的替代方案,即将 frisby 中的期望函数复制到您的代码中并调用该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);
});
于 2017-11-23T12:33:57.263 回答
0

我找到了原始问题的更好解决方案。当我开始实施@duyker 的建议时。我注意到(最后)Frisby 代码有意忽略对 Jasmine 的依赖,如果它不存在,但有一个错误。所以我提交了一个修复它。它被接受了。

现在问题解决了,Frisby 可以在没有 Jasmine 或 Jest 的情况下工作。

于 2017-11-27T22:57:00.380 回答