使用带有 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 的情况下工作。