可选单元的单元测试

时间:2013-09-29 08:05:41

标签: unit-testing mocha

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

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

1 个答案:

答案 0 :(得分:4)

理想情况,可以在skipdescribe上使用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