Unit testing 可选单元的单元测试
我有一个Node.js软件,它包含几个可选单元。每个可选单元都要求用户下载并安装特定的第三方软件。其他(非可选)单元在没有第三方的情况下工作 现在,我有一套针对所有单元的Mocha.js单元测试,包括可选单元。因为我已经安装了所有第三方,所以所有测试都在我的计算机上通过。然而,如果一个天真的用户下载我的软件包并运行测试,他会因为缺少第三方而收到难看的错误消息 安排测试的最佳方式是什么,这样对于每个用户,只运行相关的测试 目前,我使用的代码与此类似:Unit testing 可选单元的单元测试,unit-testing,mocha.js,Unit Testing,Mocha.js,我有一个Node.js软件,它包含几个可选单元。每个可选单元都要求用户下载并安装特定的第三方软件。其他(非可选)单元在没有第三方的情况下工作 现在,我有一套针对所有单元的Mocha.js单元测试,包括可选单元。因为我已经安装了所有第三方,所以所有测试都在我的计算机上通过。然而,如果一个天真的用户下载我的软件包并运行测试,他会因为缺少第三方而收到难看的错误消息 安排测试的最佳方式是什么,这样对于每个用户,只运行相关的测试 目前,我使用的代码与此类似: try { var thirdpart
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() { ... }
});
}
可选单元是否有更好、更通用的解决方案?理想情况下,可以使用
描述或it
上的跳过,将测试标记为挂起。看
虽然在您的示例中,布尔值用于确定是否将测试标记为挂起,但这里有一个解决方案
如果it()。看
这里有一个例子。如果我们有一个名为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,两个测试都将运行(它们通过,这并不奇怪):
…但是,如果第二个测试是这样更改的(使用三元中的istestreevant
变量,其中null
可以作为回调参数):
…如果isterevent
为false,则该测试将显示为挂起:
The Assert module
✓ sees true as true
- sees false as not true
1 passing (19ms)
1 pending
要根据IStreelevant更改测试名称,请以类似方式再次使用三元运算符
创建另一个变量以保存要更改的名称:
var skippedTestName = "A test was skipped because ...";
…然后将“sees false as not true”测试的语法更改为:
现在,测试输出将如下所示:
The Assert module
✓ sees true as true
- A test was skipped because ...
1 passing (19ms)
1 pending
理想情况下,可以在描述
或it
上使用跳过
,将测试标记为挂起。看
虽然在您的示例中,布尔值用于确定是否将测试标记为挂起,但这里有一个解决方案
如果it()。看
这里有一个例子。如果我们有一个名为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,两个测试都将运行(它们通过,这并不奇怪):
…但是,如果第二个测试是这样更改的(使用三元中的istestreevant
变量,其中null
可以作为回调参数):
…如果isterevent
为false,则该测试将显示为挂起:
The Assert module
✓ sees true as true
- sees false as not true
1 passing (19ms)
1 pending
要根据IStreelevant更改测试名称,请以类似方式再次使用三元运算符
创建另一个变量以保存要更改的名称:
var skippedTestName = "A test was skipped because ...";
…然后将“sees false as not true”测试的语法更改为:
现在,测试输出将如下所示:
The Assert module
✓ sees true as true
- A test was skipped because ...
1 passing (19ms)
1 pending
谢谢,这比我以前的解决方案好多了。当测试被禁用时,是否有任何方法可以让Mocha在报告中添加自定义消息,例如:“-将false视为not true此测试被禁用,因为您没有安装false.js模块”?@ErelSegalHalevi不客气。这是可能的,尽管这会使情况更加混乱。:)我用一个例子更新了我的答案。谢谢!我想你的答案应该是Mocha.js的标准功能:)@tstanton,谢谢!我采用了一种稍微不同的方法来创建可选测试的概念。如果通过,则一切正常;如果失败,则将特定测试标记为可选测试。这里有更多信息:我无法抗拒,为此创建了一个npm模块:谢谢,这比我以前的解决方案好得多。当测试被禁用时,是否有任何方法可以让Mocha在报告中添加自定义消息,例如:“-将false视为not true此测试被禁用,因为您没有安装false.js模块”?@ErelSegalHalevi不客气。这是可能的,尽管这会使情况更加混乱。:)我用一个例子更新了我的答案。谢谢!我想你的答案应该是Mocha.js的标准功能:)@tstanton,谢谢!我采用了一种稍微不同的方法来创建可选测试的概念。如果通过,则一切正常;如果失败,则将特定测试标记为可选测试。这里有更多信息:无法抗拒自己,为此创建了一个npm模块: