引导摩卡测试套件

时间:2013-12-21 21:41:02

标签: node.js mocha

我在Node JS应用程序中的多个文件中分布了大量测试。我想在Mocha执行任何测试文件之前运行bootstrap代码。例如,我可以在每个实际测试中设置全局变量。

示例引导代码

global.chai = require('chai');
global.expect = chai.expect;
global.sinon = require('sinon');

似乎Mocha按字母顺序加载/ test下的所有文件,所以如果我将这个引导代码命名为“bootstrap.js”,而其他所有文件都在“B”之后用起始字母命名,那么它就“有效”。

显然这很脆弱,但是我不想把这个样板需要我的支持库放在每个测试文件的顶部。

如何告诉Mocha首先加载引导脚本,或创建功能相同的东西?

4 个答案:

答案 0 :(得分:10)

你试过mocha --require mymodule.js TESTS_DIR

吗?

来自文档

  

-r, - required

     

--require选项对于诸如should.js之类的库非常有用,所以你   可能只是 - 需要而不是手动调用   每个测试文件中的require('should')。请注意,这适用于   应该是因为它增强了Object.prototype,但是如果你想访问它   一个模块的导出你必须要求它们,例如var   should = require('should')。

您也可以在每个测试的顶部写入以加载require("./bootstrap.js")并运行测试。

答案 1 :(得分:2)

我使用mocha的标志--delay

  

如果您需要在任何之前执行异步操作   套件运行,你可能会延迟根套件。简单地用Mocha运行   --delay标志。这将在中提供一个特殊的函数run()   全球背景。

setTimeout(function() {
    // do some setup

    describe('my suite', function() {
        // ...
    });

    run();
}, 5000);

答案 2 :(得分:0)

如果在运行Mocha之前,您希望首先在使用ECMAScript 2015模块语法的文件中运行一些引导代码(即import而不是require

  • 创建以下文件:

./ setupBabel.js (引导Babel转发器)

require('babel-polyfill');
require('babel-register');

./ setupDependencies.js (使用ES2015语法引导Chai和Sinon)

import chai from 'chai';
import sinon from 'sinon';
global.expect = chai.expect;
global.sinon = sinon;

./test / codeSpec.js (使用Chai,Sinon Stubs,Spies和ES2015语法进行单元测试,例如箭头函数,letconst

describe('test suite', () => {
  it('does not modify immutable constant value', () => {
    const myStub = sinon.stub();
    const mySpy = sinon.spy(myStub);
    myStub.returns({});
    let val = 1;
    expect(val).to.not.equal(2);
    sinon.assert.notCalled(mySpy);
  });
});
  • 在终端中运行以下命令以安装相关的NPM包:

npm install babel-polyfill babel-register chai sinon mocha

  • 使用以下终端命令和标志运行测试套件:

mocha --require ./setupBabel.js --require ./setupDependencies.js ./test/codeSpec.js

答案 3 :(得分:-2)

describe('异步钩子测试', function () {

  const lover = {
    bodyname: 'yueyue',
    girlname: 'fangfang'
  }

  const test = 'lihang'

  beforeEach('每一个测试之前的钩子', function () {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve('通过')
      })
    })
  })

  it('方方爱张越', function () {
    // 是否等于yueuyue
    expect(lover.bodyname).to.equal('yueyue')

    // 是否是一个字符串
    lover.girlname.should.equal('fangfang')
  })
})