web-dev-qa-db-ja.com

mochaは変数を次のテストに渡します

_describe('some test', function(){
    // Could put here a shared variable
    it('should pass a value', function(done){
        done(null, 1);
    });
    it('and then double it', function(value, done){
        console.log(value * 2);
        done();
    });
});
_

上記は現在、モカでは機能しません。

解決策は、上記のように、テスト間で変数を共有することです。

async.waterfall()を使用すると、これが非常に可能になり、本当に気に入っています。モカでそれを実現する方法はありますか?

ありがとう!

24
Poni

あるテストが別のテストで実行される計算に依存しないように、テストを分離したままにしておくことをお勧めします。値テストAを渡すテストと、テストBを取得するテストを呼び出しましょう。考慮すべき質問がいくつかあります。

  1. テストAとテストBは本当に2つの異なるテストですか?そうでない場合、それらを組み合わせることができます。

  2. テストAは、テストBにテスト対象のフィクスチャを提供することを意図していますか?その場合、テストAはbeforeまたはbeforeEach呼び出しのコールバックになるはずです。基本的に、describeのクロージャ内の変数にデータを割り当てることで、データを渡します。

    describe('some test', function(){
        var fixture;
    
        before(function(done){
            fixture = ...;
            done();
        });
    
        it('do something', function(done){
            fixture.blah(...);
            done();
        });
    });
    

Mochaのコードを読みましたが、何かを忘れていない限り、describeit、またはdoneコールバックを呼び出して値を渡す方法はありません。したがって、上記の方法はそれです。

53
Louis

ルイが言ったことに非常に同意します、そして、それはモカが実際にそれをサポートしない理由です。参照した非同期メソッドを考えてください。最初のテストが失敗すると、残りのテスト全体でウォーターフォールエラーが発生します。

あなたが言うように、それを行う唯一の方法は、変数を上部に固定することです:

describe('some test', function(){
    var value = 0;
    it('should pass a value', function(done){
        value = 5;
        done();
    });
    it('and then double it', function(done){
        console.log(value * 2); // 10
        done();
    });
});
7
whitfin

また、スーツまたはコンテキストオブジェクトに追加することもできます。

この例では、スーツオブジェクトに追加されます

describe('suit', function(){
    before(() => {
        this.suitData = 'suit';
    });

    beforeEach(() => {
        this.testData = 'test';
    });


    it('test', done => {
         console.log(this.suitData)// => suit
         console.log(this.testData)// => test
    })
});
4
Yaki Klein