我现在正在使用mocha进行javascript单元测试。
我有几个测试文件,每个文件都有before
和beforeEach
,但它们完全相同。
如何为所有这些(或其中一些)提供全局before
和beforeEach
?
答案 0 :(得分:75)
在测试文件夹的根目录中,创建一个全局测试助手test/helper.js
,其中包含您的before和beforeEach
// globals
global.assert = require('assert');
// setup
before();
beforeEach();
// teardown
after();
afterEach();
答案 1 :(得分:25)
在单独的文件中声明before
或beforeEach
(我使用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)
根目录挂钩
您还可以选择任何文件并添加“根”级挂钩。例如, 在所有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.
)很重要,因此您的测试运行人员可以选择它……
mocha.opts
\ o / 如果有东西,您真的只想在运行测试之前进行一次设置(不管是哪个测试...),mocha.opts
是一个令人惊讶的优雅选择! –只需在文件中添加require
(是的,即使它对Mocha的贡献很小,但对您的测试设置也没有影响)。它将可靠地运行一次:
(在此示例中,我检测到是否要运行单个测试或多个测试。在前一种情况下,我输出每个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
});
});
});