1. ホーム
  2. node.js

[解決済み] Mocha における describe() の役割は何ですか?

2023-06-29 03:40:21

質問

のドキュメントは Mocha 公式サイト のドキュメントにこの例があります。

describe('User', function(){
  describe('#save()', function(){
    it('should save without error', function(done){
      var user = new User('Luna');
      user.save(function(err){
        if (err) throw err;
        done();
      });
    })
  })
})

の中でいつテストをネストすべきか知りたい。 describe 関数の基本的な目的は何なのか、そして describe は何なのか。に渡される最初の引数を比較することはできますか? describe に渡される最初の引数を、プログラミング言語のコメントと比較できますか?何も表示されない describe は何も表示されません。読みやすくするためだけなのか、それともこの関数に何か他の使い道があるのでしょうか?

このような使い方をした場合、何か問題があるのでしょうか?

describe('User', function(){
    describe('#save()', function(){
        var user = new User('Luna');
        user.save(function(err){
            if (err) throw err;
            done();
        })
    })
})

このようにしても、テストはパスします。

どのように解決するのですか?

この it の呼び出しは個々のテストを識別しますが、それ自体では it は Mocha にテストスイートがどのようなものであるかについて何も伝えません。 構造 . テストスイートの describe の呼び出しをどのように使うかが、テストスイートに構造を与えることになります。以下は describe を使ってテストスイートを構造化することで、できることのいくつかを紹介します。以下はテストスイートの例で、議論のために簡略化してあります。

function Foo() {
}

describe("Foo", function () {
    var foo;
    beforeEach(function () {
        foo = new Foo();
    });
    describe("#clone", function () {
        beforeEach(function () {
            // Some other hook
        });
        it("clones the object", function () {
        });
    });
    describe("#equals", function () {
        it("returns true when the object passed is the same", function () {
        });
        it("returns false, when...", function () {
        });
    });
    afterEach(function () {
        // Destroy the foo that was created.
        // foo.destroy();
    });
});

function Bar() {
}

describe("Bar", function () {
    describe("#clone", function () {
        it("clones the object", function () {
        });
    });
});

想像してみてください FooBar は本格的なクラスです。 Foo には cloneequals メソッドを使用します。 Barclone . 上記のような構造は、これらのクラスのテストを構成するための一つの可能な方法です。

(その # の表記は、いくつかのシステム (たとえば jsdoc など) ではインスタンスフィールドを示すために使われています。そのため、メソッド名と一緒に使用すると、クラスのインスタンスで呼び出されるメソッドを表します (クラスメソッドではなく、クラス自体で呼び出されます)。がなくてもテストスイートは同じように動作します。 # .)

バナーの提供

Mocha のレポーターの中には、あなたがつけた名前を describe につけた名前を表示します。たとえば spec レポーター (これを使うには $ mocha -R spec を実行することで使用できます)、報告することになります。

  Foo
    #clone
      ✓ clones the object 
    #equals
      ✓ returns true when the object passed is the same 
      ✓ returns false, when... 

  Bar
    #clone
      ✓ clones the object 


  4 passing (4ms)

実行するパーツの選択を支援する

一部のテストだけを実行したい場合は、テスト実行時に --grep オプションを使用します。ですから、もしあなたが Bar クラスだけを気にするのであれば、次のようにすればよいでしょう。 $ mocha -R spec --grep Bar と入力し、出力を得ます。

  Bar
    #clone
      ✓ clones the object 


  1 passing (4ms)

あるいは clone メソッドにしか興味がないのであれば $ mocha -R spec --grep '\bclone\b' を実行し、出力を得ます。

  Foo
    #clone
      ✓ clones the object 

  Bar
    #clone
      ✓ clones the object 


  2 passing (5ms)

に与えられた値は --grep は正規表現として解釈されます。 \bclone\b という単語だけを要求しています。 clone のようなものでなく clones または cloned .

フックを提供する

上の例では beforeEachafterEach の呼び出しはフックです。それぞれのフックは it の中にある describe 呼び出しの中にあるもので、フックの親となります。様々なフックがあります。

  • beforeEach これは個々の it の中で describe を呼び出します。

  • afterEach これは個々の it の中で describe を呼び出します。

  • before の前に一度だけ実行されます。 it の中にある describe の呼び出しが実行される。

  • after これは個々の it の中にある describe の呼び出しが実行される。

これらのフックは、テストに必要なリソースの取得やデータ構造の作成に使用でき、テスト終了後にリソースを解放したり、これらの構造を(必要であれば)破棄することができます。

あなたの質問の最後に示されたスニペットはエラーを生成しませんが、実際にはどんなテストも含んでいません。 it .