1

Jasmine 単体テストでグローバル変数が未定義として表示されるという問題が発生しています。Squire を使用して、RequireJS を介して注入された依存関係を持ついくつかのクラスをモックしています。これは、私の単体テストの縮小された例です。

私の「サービス」クラス (service.js)

define(['durandal/system', 'cache'],
    function (system, cache) {
        var dataservice = {

            retrieveData: function () {
                return cache.getCachedData();
            }
        };

        return dataservice;
});

「キャッシュ」依存関係をモックするための私のフィクスチャ。

define(['Squire'], function (Squire) {
    var injector = new Squire();

    return {
        initialize: function () {
            injector.clean();

             injector.mock('cache', {
                getCachedData: function () {
                    return { item: "one" };
                }
            });

            return injector;
        }
    };
});

そして私の仕様:

define(['dataservice_fixture', 'durandal/system'],
    function (testFixture, system) {
        var container = testFixture.initialize();
        var dataserviceModule;

        container.require(['service'], function (preparedDataservice) {
            dataserviceModule = preparedDataservice;
        });

        describe('The data service ', function () {
            it('should exist.', function () {
                expect(dataserviceModule).toBeDefined();
            });
        });
    });

私の「存在すべき」テストでは、dataserviceModule は定義されていません。ただし、フィクスチャ (上記のコンテナー) がそれを取り込むときはそうなると思います。ここで、define() の仕様の上部にある「サービス」を取り込み、そこに dataserviceModule を設定すると、テストはそれを定義済みと見なします。 .

私の container.require が変数を 1 つ上のスコープに設定していないか、それとテストの実行の間で失われているのはなぜですか? 巻き上げに関するこの質問を読みましたが、container.require 内で同じ変数名を再宣言していません。

4

1 に答える 1

1

モジュールをロードする前にテストが実行されているという点で、これは実際には競合状態のようです。これを解決するために、waitsFor と、モジュールがロードされた後に true になるラッチを追加しました。

遭遇した人は、http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.htmlをチェックしてください。

于 2016-11-16T21:58:47.587 に答える