全球`之前'和`之前'为摩卡?

时间:2012-05-12 06:31:26

标签: javascript unit-testing mocha

我现在正在使用mocha进行javascript单元测试。

我有几个测试文件,每个文件都有beforebeforeEach,但它们完全相同。

如何为所有这些(或其中一些)提供全局beforebeforeEach

6 个答案:

答案 0 :(得分:75)

在测试文件夹的根目录中,创建一个全局测试助手test/helper.js,其中包含您的before和beforeEach

// globals
global.assert = require('assert');

// setup
before();
beforeEach();

// teardown
after();
afterEach();

答案 1 :(得分:25)

在单独的文件中声明beforebeforeEach(我使用spec_helper.coffee)并要求它。

spec_helper.coffee

afterEach (done) ->
  async.parallel [
    (cb) -> Listing.remove {}, cb
    (cb) -> Server.remove {}, cb
  ], ->
    done()

test_something.coffee

require './spec_helper'

答案 2 :(得分:23)

来自mocha documentation

  

根目录挂钩

     

您还可以选择任何文件并添加“根”级挂钩。例如,   在所有describe()块之外添加beforeEach()。这将导致   回调至beforeEach()以在任何测试用例之前运行,无论   文件所在的位置(这是因为Mocha隐含了describe()   块,称为“根套件

首先收集所有常规describe()-suites,然后再运行 ,这样可以保证首先被调用。

'use strict'
let run = false

beforeEach(function() {
    if ( run === true ) return
    console.log('GLOBAL ############################')
    run = true
});

如果希望每次运行之前都查看运行标志,请删除它。

我将此文件命名为test/_beforeAll.test.js。不需要在任何地方导入/要求它,但是文件名中的.test.(分别是.spec.)很重要,因此您的测试运行人员可以选择它……


奖金轨道8-):使用mocha.opts \ o /

如果有东西,您真的只想在运行测试之前进行一次设置(不管是哪个测试...),mocha.opts是一个令人惊讶的优雅选择! –只需在文件中添加require(是的,即使它对Mocha的贡献很小,但对您的测试设置也没有影响)。它将可靠地运行一次:

enter image description here

(在此示例中,我检测到是否要运行单个测试或多个测试。在前一种情况下,我输出每个log.info(),而在完整运行时,我将冗长程度降低为error + warn ... )

更新

如果有人知道一种方法,可以访问即将在once.js中运行的mocha套件的一些基本属性,我很想知道并在此处添加。 (即我的suiteMode检测很糟糕,如果还有另一种检测方法,则要运行多少个测试…)

答案 3 :(得分:1)

当我需要“模拟”依赖项之一使用的全局变量时,我遇到了类似的问题。

我为此使用了.mocharc.js,因为在设置“ mocha”环境时,该JS文件中的代码将执行一次。

.mocharc.js示例:

global.usedVariable = "someDefinedValue";

/** other code to be executed when mocha env setup **/

module.exports = {};

这对我有用,但是这样做似乎很“肮脏”。 请发表评论,如果您知道该代码的合适位置:)

答案 4 :(得分:1)

mochaHooks Mocha 8 上的 root hook 插件最小示例

此机制目前记录在:https://mochajs.org/#root-hook-plugins

它不适用于 before,但仅适用于 beforeEach,因为 before 不在可用钩子列表中:https://mochajs.org/#available-root-hooks

这是一个演示:

test/global.js

// Root hook.
exports.mochaHooks = {
  beforeEach(done) {
    console.log('mochaHooks.beforeEach');
    done();
  },
};

// Bonus: global fixture, runs once before everything.
exports.mochaGlobalSetup = async function() {
  console.log('mochaGlobalSetup');
};

test/mytest.js

var assert = require('assert');

describe('describe0', function() {
  // Only runs before the current describe.
  before(async () => {
    console.error('before describe 0');
  });
  beforeEach(async () => {
    console.error('beforeEach describe 0');
  });
  it('it 0 0', function() {
    assert.equal(0, 0);
  });
  it('it 0 1', function() {
    assert.equal(0, 0);
  });

  describe('describe 0 0', function() {
    before(async () => {
      console.error('before describe 0 0');
    });
    beforeEach(async () => {
      console.error('beforeEach describe 0 0');
    });
    it('it 0 0 0', function() {
      assert.equal(0, 0);
    });
    it('it 0 0 1', function() {
      assert.equal(0, 0);
    });
  });

  describe('describe 0 1', function() {
    before(async () => {
      console.error('before describe 0 1');
    });
    beforeEach(async () => {
      console.error('beforeEach describe 0 1');
    });
    it('it 0 1 0', function() {
      assert.equal(0, 0);
    });
    it('it 0 1 1', function() {
      assert.equal(0, 0);
    });
  });
});

然后您使用 --require 启用该文件:

npx mocha --require test/global.js test/

结果:

mochaGlobalSetup


  describe0
before describe 0
mochaHooks.beforeEach
beforeEach describe 0
    ✓ it 0 0
mochaHooks.beforeEach
beforeEach describe 0
    ✓ it 0 1
    describe 0 0
before describe 0 0
mochaHooks.beforeEach
beforeEach describe 0
beforeEach describe 0 0
      ✓ it 0 0 0
mochaHooks.beforeEach
beforeEach describe 0
beforeEach describe 0 0
      ✓ it 0 0 1
    describe 0 1
before describe 0 1
mochaHooks.beforeEach
beforeEach describe 0
beforeEach describe 0 1
      ✓ it 0 1 0
mochaHooks.beforeEach
beforeEach describe 0
beforeEach describe 0 1
      ✓ it 0 1 1


  6 passing (6ms)

所以我们看到全局钩子在每个本地 beforeEach 之前运行。

对于 before,我找不到比定义一个助手并从每个 before 调用它更好的解决方案:How can I make Mocha load a helper.js file that defines global hooks or utilities?

在 mocha 8.3.2、Node v14.16.0 上测试。

答案 5 :(得分:-2)

使用模块可以更轻松地为您的测试套件进行全局设置/拆卸。以下是使用RequireJS(AMD模块)的示例:

首先,让我们使用全局设置/拆卸来定义测试环境:

// test-env.js

define('test-env', [], function() {
  // One can store globals, which will be available within the
  // whole test suite.
  var my_global = true;

  before(function() {
    // global setup
  });
  return after(function() {
    // global teardown
  });
});

在我们的JS运行器中(包含在mocha的HTML运行器中,与其他库和测试文件一样,作为<script type="text/javascript">…</script>或更好,作为外部JS文件):

require([
          // this is the important thing: require the test-env dependency first
          'test-env',

          // then, require the specs
          'some-test-file'
        ], function() {

  mocha.run();
});

some-test-file.js可以像这样实现:

// some-test-file.js

define(['unit-under-test'], function(UnitUnderTest) {
  return describe('Some unit under test', function() {
    before(function() {
      // locally "global" setup
    });

    beforeEach(function() {
    });

    afterEach(function() {
    });

    after(function() {
      // locally "global" teardown
    });

    it('exists', function() {
      // let's specify the unit under test
    });
  });
});