1

我有一个包含几个可选单元的 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() { ... }
    });
}

对于可选单元是否有更好、更通用的解决方案?

4

1 回答 1

4

理想情况下,人们会使用skipondescribe或 onit将测试标记为待处理。请参阅“包容性测试”

尽管在您的示例中,布尔值用于确定是否将测试标记为待处理,所以这里有一个解决方案。

如果it()没有第二个参数(进行断言的回调函数),Mocha 似乎将该测试标记为“待处理”(不运行测试)。请参阅“待定测试”


这是一个例子。如果我们有一个名为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 ...";

...然后将“将假视为不真”测试的语法更改为:

  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
于 2013-10-03T00:33:37.180 回答