我有一个包含几个可选单元的Node.js软件。每个可选单元都要求用户下载并安装某个第三方软件。其他(非选修)单位在没有第三方的情况下工作。
现在,我为所有单位提供了一套Mocha.js单元测试,包括可选单元。所有测试都通过我的计算机,因为我安装了所有第三方。但是,如果一个天真的用户下载我的软件包并运行测试,由于缺少第三方,他将收到难看的错误消息。
安排测试的最佳方法是什么,这样每个用户只会运行相关的测试?
目前,我使用的代码类似于:
try {
var thirdparty = require('thirdparty');
var isTestRelevant = true;
} catch (e) {
console.warn("WARNING: no thirdparty module - can't run this unitest");
var isTestRelevant = false;
}
if (isTestRelevant) {
describe('the unit', function() {
it('does something', function() { ... }
});
describe('the unit', function() {
it('does something else', function() { ... }
});
}
是否有更好,更通用的可选单元解决方案?
答案 0 :(得分:4)
理想情况,可以在skip
或describe
上使用it
将测试标记为待处理。请参阅"Inclusive tests"。
虽然在您的示例中,使用布尔值来确定是否将测试标记为挂起,因此这是一个解决方案。
如果it()
没有第二个参数(用于进行断言的回调函数),则Mocha似乎将该测试标记为“待定”(不运行测试)。请参阅"Pending tests"。
这是一个例子。如果我们有一个名为conditionalTests.test.js
的文件:
var assert = require('assert');
describe("The Assert module", function () {
it("sees true as true", function() {
assert.ok(true);
});
it("sees false as not true", function() {
assert.ok(!false);
});
});
...并且Mocha被调用,两个测试都将运行(它们通过,并不奇怪):
$ mocha --reporter spec conditionalTests.test.js
The Assert module
✓ sees true as true
✓ sees false as not true
2 passing (19ms)
...但是,如果第二次测试是这样改变的(使用三元组中的isTestRelevant
变量,其中null
可以作为回调参数):
it("sees false as not true", isTestRelevant ? function() {
assert.ok(!false);
} : null);
...如果isTestRelevant
为假,该测试将显示为待处理:
The Assert module
✓ sees true as true
- sees false as not true
1 passing (19ms)
1 pending
要根据isTestRelevant
更改测试名称,请以类似方式再次使用三元运算符。
创建另一个变量以保存要更改为的名称:
var skippedTestName = "A test was skipped because ...";
...然后将“see false as not true”测试的语法更改为:
it(
isTestRelevant ?
"sees false as not true" : skippedTestName,
isTestRelevant ?
function() {
assert.ok(!false);
} : null
);
现在测试输出如下:
The Assert module
✓ sees true as true
- A test was skipped because ...
1 passing (19ms)
1 pending