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

理想的skipには、 ondescribeまたは onを使用しitて、テストを保留中としてマークします。「包括的テスト」を参照してください。

あなたの例の場合、テストを保留中としてマークするかどうかを決定するためにブール値が使用されるため、ここに解決策があります。

2 番目の引数 (アサーションを作成するためのコールバック関数) がない場合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)

...しかし、2番目のテストがそのように変更された場合(コールバック引数として可能なisTestRelevant三項変数を使用):null

  it("sees false as not true", isTestRelevant ? function() {
    assert.ok(!false);
  } : null);

...そのテストは、 isTestRelevantfalse の場合は保留中として表示されます。

  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 ...";

...次に、「false を 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
于 2013-10-03T00:33:37.180 に答える