MochaJS:如何在测试之间共享断言/"it('should')" 代码

MochaJS: How to share assertion/"it('should')" code between tests

我有一些 mocha 测试 运行 使用 Nodejs 来测试网络服务器。

许多测试会导致服务器 return 出错,例如400 错误请求。

目前测试中充斥着以下代码的许多副本:

it('should respond with 400 (Bad Request)', function (){
    expect(httpResponse.statusCode).to.equal(httpstatus.BAD_REQUEST);
});

这是一个简化的伪代码示例:

describe('When passing bad JSON data', function(){
    var response
    before(function(done){
        callUrlToInsert(url, badJson, function(err, resp){
            response = resp
            done()
        }
    }
    it('should respond with 400 (Bad Request)', function (){
        expect(httpResponse.statusCode).to.equal(httpstatus.BAD_REQUEST)
    })
}

这让我很烦恼,因为作为一名程序员,我尽可能避免重复代码。

但是,将其放入函数中不起作用:

function verifyItReturnedBadRequest400(httpResponse)
{
    it('should respond with 400 (Bad Request)', function (){
        expect(httpResponse.statusCode).to.equal(httpstatus.BAD_REQUEST);
    });
}

因为对 it() 的调用并没有立即测试断言;我的 [有限] 理解是 it() 将闭包添加到测试列表中。所以当检查完成时,httpResponse 变量已经超出范围。 (我不明白为什么会这样,因为在这两种情况下都有对它的调用();为什么在一种情况下它在另一个函数调用级别内很重要?我可能遗漏了一些关于Javascript 范围。)

是否有避免所有这些重复代码的通用方法?还是每个人都在到处复制他们所有的断言代码?这是我第一次涉足 Mocha,所以我可能遗漏了一些明显的东西。

此外,解释 为什么函数方法不起作用?

加分

谢谢!

wiki 上有一篇关于此的文章。 https://github.com/mochajs/mocha/wiki/Shared-Behaviours

我猜你的测试有一些错误。将 it() 放入包装函数中可以正常工作。这是一个小型工作演示。

'use strict';

const assert = require('assert');

const xEqualsOne = () => {
  it('should be equal 1', () => {
    assert.equal(this.x, 1);
  });
};

describe('async number', () => {
  this.x = 0;

  before(done => {
    this.x++
    setTimeout(done, 100);
  });

  xEqualsOne();
});

我猜你的代码看起来像这样:

describe('When passing bad JSON data', function(){
    var response
    before(function(done){
        callUrlToInsert(url, badJson, function(err, resp){
            response = resp
            done()
        }
    }
    verifyItReturnedBadRequest400(httpResponse)
}

这样想:

  1. it() 创建一个测试。
  2. 所有对 it 的调用发生在 之前 任何测试实际上是 运行 (您必须在 运行 它们之前创建测试)
  3. 传递给 `before' 的函数是在创建测试之后 运行,但是 before 它们是 运行.
  4. verifyItReturnedBadRequest400 调用 it 来创建一个测试,但是你在任何测试 运行 之前传递了 httpResponse,所以 before 还没有运行 还是。

您可以继续使用那种模式,但您需要将 httpresponse 放入容器中以便传递对它的引用:

describe('When passing bad JSON data', function(){
    var data = {};
    before(function(done){
        callUrlToInsert(url, badJson, function(err, resp){
            data.response = resp
            done()
        }
    }
    verifyItReturnedBadRequest400(data)
}

然后你的 verifyItReturnedBadRequest400 变成:

function verifyItReturnedBadRequest400(data) {
    it('should respond with 400 (Bad Request)', function (){
        expect(data.response.statusCode).to.equal(httpstatus.BAD_REQUEST);
    });
}