全局变量未在Jasmine单元测试中分配

时间:2016-11-16 21:15:10

标签: javascript unit-testing jasmine requirejs squirejs

我在使用Jasmine单元测试时遇到一些问题,将全局变量视为未定义。我使用Squire来模拟一些带有通过RequireJS注入的依赖项的类。以下是我的单元测试的精简示例:

我的服务' class(s​​ervice.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();
            });
        });
    });

我的应该存在' test,dataserviceModule未定义。我希望当我的夹具(上面的容器)把它拉进去的时候。现在,如果我进入服务'在我的spec(在define()中的顶部,并在那里设置dataserviceModule,测试将其视为已定义。

为什么我的container.require要么不将变量设置为更高的范围,要么在测试运行之间丢失?我在提升时阅读了这个this question,但我没有在我的container.require中重新声明相同的变量名。

1 个答案:

答案 0 :(得分:1)

看起来这实际上是竞争条件,因为在我的模块可以加载之前运行测试。我添加了waitsFor和一个在我的模块加载后解锁的锁存器。

对于遇到过的人,请查看http://www.htmlgoodies.com/beyond/javascript/test-asynchronous-methods-using-the-jasmine-runs-and-waitfor-methods.html