web-dev-qa-db-ja.com

Mochaで空のプレースホルダーテストを意図的に失敗させる方法は?

NodeJSでAPIを作成し、Mocha、Chai、SuperTestを使用してテストしています。私は、最初にテストを記述し、次にそれらのテストを動作するコードで満たすという、典型的なテスト駆動アプローチを使用しています。ただし、さまざまな順列すべてのテストの数が多いため、空のプレースホルダーテストを作成し始めました。これにより、すべてのit('should...')の説明が配置され、その機能に到達したときに何をテストするかを思い出させることができます。 。例えば:

_it 'should not retrieve documents without an authorized user', (done) ->
    done()
_

これに伴う問題は、done()がアサーションなしで呼び出されるため、テストに合格したと見なされるため、次のアサーションを追加しました。

_false.should.equal true # force failure
_

しかし、これはハックであり、Mochaが表示する失敗の理由は、特に他の完全なテストが失敗する可能性がある場合、混乱するように見える可能性があります。

モカでこのようなプレースホルダーテストを意図的に失敗させる公式の方法はありますか?

16
Soviut

テストをまだテストの準備ができていないものとしてマークする公式の方法は、skipを使用することです。これはdescribeitのフィールドとして表示されるメソッドです。次に例を示します。

describe("not skipped", function () {
    it("bar", function () {
        throw new Error("fail");
    });

    it.skip("blah", function () {
        throw new Error("fail");
    });
});

describe.skip("skipped", function () {
    it("something", function () {
        throw new Error("fail");
    });
});

上記のコードをtest.jsファイルに入れ、$ mocha --reporter=spec test.jsで実行すると、次のようになります。

  not skipped
    1) bar
    - blah

  skipped
    - something


  0 passing (4ms)
  2 pending
  1 failing

  1) not skipped bar:
     Error: fail
      at Context.<anonymous> (/tmp/t33/test.js:3:15)
      at callFn (/home/ldd/local/lib/node_modules/mocha/lib/runnable.js:223:21)
      at Test.Runnable.run (/home/ldd/local/lib/node_modules/mocha/lib/runnable.js:216:7)
      at Runner.runTest (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:374:10)
      at /home/ldd/local/lib/node_modules/mocha/lib/runner.js:452:12
      at next (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:299:14)
      at /home/ldd/local/lib/node_modules/mocha/lib/runner.js:309:7
      at next (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:247:23)
      at Object._onImmediate (/home/ldd/local/lib/node_modules/mocha/lib/runner.js:276:5)
      at processImmediate [as _immediateCallback] (timers.js:354:15)

-が前に付いているテスト名はスキップされます。また、色をサポートする端末では、スキップされたテストは青で表示されます(失敗したテストの場合は赤、合格の場合は緑とは対照的です)。スキップされたテストは「保留中」と呼ばれるため、Mochaはスキップされたテストの数を「2保留中」として報告します。

22
Louis

2018年5月19日の時点で、これは公式の方法です: https://mochajs.org/#pending-tests

実装されていないテストはfailであってはならず、pendingとしてマークされている必要があります。

モカテストをnot yet implementedとしてマークする簡潔な方法は、コールバック関数をitハンドラーに渡さないことです。

describe("Traverse", function(){
    describe("calls the visitor function", function(){
        it("at every element inside an array")
        it("at every level of a tree")
    })
})

mocha testを実行すると、実装されていないテストが保留中として表示されます。

$ mocha test

  Traverse
    calls the visitor function
      - at every element inside an array
      - at every level of a tree


  0 passing (13ms)
  2 pending
28
James Forbes

文字列またはエラーをdone()に渡すと、エラーとして報告されます。そう:

it 'should not retrieve documents without an authorized user', (done) ->
    done('not implemented')

次の出力でテストが失敗します。

エラーなしで呼び出されたdone():実装されていません


テストを「保留中」とマークするためにコールバックを渡さないという@Canyonのソリューションが好きですが、私の場合、これらのプレースホルダーをCIビルドに失敗させたいので、このような実際の失敗するテストにする方が簡単でした。

7
CodingWithSpike

これも非常に便利だと思うので、これは実際には良い質問です。それを見た後、コードベース全体で再利用できる独自のラッパー「todo」または「fail」関数を作成することを考えます。

以下の例では、「まだ実装されていません」というテキストを出力するtodoという関数を使用しています。これは、すべてのテストをインポートして使用できる場合でも、個別のモジュールとして役立つ場合があります。コードを少し変更する必要があるかもしれません...

チャイアサートの例

var assert = require('chai').assert;

function todo() {
    assert(false, "method not yet implemented"); 
};

describe("some code", function(){
    it("should fail something", function(){
        todo();
    });
});

失敗オプションを指定したchaiasertの使用例(不要に見えますが)

var assert = require('chai').assert;

function todo() {
    assert.fail(true, true, "method not yet implemented");   //1st 2 args can be anything really
};

describe("some code", function(){
    it("should fail something", function(){
        todo();
    });
});
5
Justin Maat