8

私は事実上同じである多くのテストを持っています。DRYとスキャン容易性のために、テストを1つの関数に抽象化してから、いくつかのパラメーターを使用してその関数を呼び出します。次に、関数はit仕様を呼び出してスイートに追加します。

スペックが他のスペックと同じように実行されbeforeEachず、共通関数で定義されたスペックの前に呼び出されないことを除いて、動作しているようです。

define(['modules/MyModule','jasmine/jasmine'], function(MyModule) {

    describe('myModule', function() {

        function commonTests(params) {
            it('should pass this test OK', function() {
                expect(true).toBe(true);
            });

            it('should fail because module is undefined', function() {
                expect(module[params.method]()).toBe('whatever');
            });
        }

        var module;

        beforeEach(function() {
            module = new MyModule();
        });

        describe('#function1', function() {
            commonTests({
                method: 'function1'
            });
        });

        describe('#function2', function() {
            commonTests({
                method: 'function2'
            });
        });

    });

});

これを行い、との機能を維持する方法はありbeforeEachますafterEachか?

アップデート:

例を間違えたようです、ごめんなさい。失敗するケースは次のとおりです。

define(['modules/MyModule'], function(MyModule) {

    function commonTests(params) {
        it('will fail because params.module is undefined', function() {
            expect(typeof params.module).toBe('object');
            expect(typeof params.module[params.method]).toBe('function');
        });

        it('has a few tests in here', function() {
            expect(true).toBe(true);
        });
    }


    describe('MyModule', function() {

        var module;

        beforeEach(function() {
            module = new MyModule();
        });

        describe('#function1', function() {
            commonTests({
                module: module,
                method: 'function1'
            });
        });

        describe('#function2', function() {
            commonTests({
                module: module,
                method: 'function2'
            });
        });

    });
});

最初の例のようにの現在の値を常に使用するのではなく、の値がmoduleへの呼び出しの一部として保持されるため、失敗すると思います。そこに着いたら解決策を投稿します...commonTestsmodule

4

2 に答える 2

5

私の最初の例が実際に機能したことを指摘してくれたAndreasに感謝します!私が使用している最終的な解決策は非常に似ています:

define(['modules/MyModule'], function(MyModule) {

    var module;

    function commonTests(params) {
        it('will not fail because module is shared', function() {
            expect(typeof module).toBe('object');
            expect(typeof module[params.method]).toBe('function');
        });

        it('has a few tests in here', function() {
            expect(true).toBe(true);
        });
    }


    describe('MyModule', function() {

        beforeEach(function() {
            module = new MyModule();
        });

        describe('#function1', function() {
            commonTests({
                method: 'function1'
            });
        });

        describe('#function2', function() {
            commonTests({
                method: 'function2'
            });
        });

    });
});

moduleただし、引数として渡す機能が必要な場合は、少し異なるアプローチを取り、ブロックcommonTestsごとに異なる機能を使用する必要があります。it

define(['modules/MyModule'], function(MyModule) {

    var module;

    function commonTest1(params) {
        expect(typeof module).toBe('object');
        expect(typeof module[params.method]).toBe('function');
    }

    function commonTest2(params) {
        expect(true).toBe(true);
    }


    describe('MyModule', function() {

        beforeEach(function() {
            module = new MyModule();
        });

        describe('#function1', function() {

            it('will not fail because module is shared', function() {
                commonTest1({ method: 'function1' });
            });

            it('has a few tests in here', function() {
                commonTest2({ method: 'function1' });
            });

        });

        describe('#function2', function() {

            it('will not fail because module is shared', function() {
                commonTest1({ method: 'function2' });
            });

            it('has a few tests in here', function() {
                commonTest2({ method: 'function2' });
            });

        });

    });
});

このようにして、共通テストを含む関数の実行は、beforeEachがコールバックを実行するまで遅延されます。

于 2012-11-01T14:39:29.857 に答える
0

はい、このシナリオは私たちにとってうまく機能します。ゲートチェックインでテストを実行するためにchutzpahを使用しますが、afterEach関数がないとテストは失敗します。

しかし、define行はのように見えrequire.jsます。それに関していくつかの問題がありました...私はそれが期待通りに定義されてMyModuleいるかどうかを推測します。undefinedメソッドにブレークポイントを設定して、beforeEach呼び出されたかどうか、およびどのような値MyModuleがあるかを確認しようとしましたか?テストをどのように呼んでいますか?

define行なしでコードを実行すると、beforeEach関数は4xと呼ばれます-予想どおり。ところで、私はchutzpah.console.exeを使用してテストを呼び出しました。

編集:

ええ、今私は自分のPCで問題を再現することができます。そして、それは私にははるかに明確です。moduleすべての変数が最初に未定義であるため、最初は未定義です。beforeEach次に、とを使用して関数をジャスミンに登録しますdescribe。ジャスミンは評価から始まります

function() {
    commonTests({
        module: module,
        method: 'function1'
    });
}

これは最初に渡されましたdescribe。この行で、module: moduleJSはの参照var module新しいオブジェクトプロパティにコピーし、これまでのところmoduleこの参照をコピーしますundefinedbeforeEachコールバックが呼び出されると、の参照が正しい値に変更さvar moduleれますが、間違った参照はすでにコピーされています...

var module私は上に移動しようとしfunction commonTestsましたが、代わりにその変数をテストで使用しましたparams.moduleが、期待どおりに合格しました。それがあなたの環境のオプションであるかどうかはわかりませんが、それがお役に立てば幸いです。

挨拶、アンドレアス

于 2012-10-31T22:11:24.980 に答える