首页 文章

使用带有Gauge的frisby.js / jest测试API

提问于
浏览
0

我正试图让gau-js与Frisby合作 . 我们使用Frisby在我们的API上运行功能测试作为黑盒测试 . 最近将Frisby升级到版本2.0.8,现在使用Jest . 一切顺利 . 现在我想在顶部添加Gauge-js以添加人类可读的测试规范/场景/步骤 .

我在Windows 8.1机器上测试:

为了使它工作,我添加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知识有点支离破碎和生疏 . 任何帮助,将不胜感激 .

2 回答

  • 0

    我找到了解决原始问题的更好方法 . 当我开始实现@duyker建议的内容时 . 我注意到(最后)Frisby代码有意忽略对Jasmine的依赖,如果它不存在,但有一个bug . 所以我提交fix for it . 它被接受了 .

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

  • 0

    .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复制到您的代码中并调用 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);
    });
    

相关问题