如何在像Jasmine这样的测试框架中加载带有RequireJS的模块进行测试?

时间:2015-04-15 11:05:08

标签: testing requirejs jasmine

我是JavaScript的新手,并尝试测试RequireJS模块中定义的函数。 这意味着我有一些像这样的代码:

define([...], function(...){
    var ModuleName = Base.extend({
        init: function(){
            //some code
        };
    });
}

现在我想测试函数init()。 我从spec.js加载对象,这有效:

describe("ModuleName", function(){
    var mod = require(['../js/app/ModuleName.js'], function(ModuleName) {});

    it("exists", function(){
        expect(mod).toBeDefined();
    });
});

这很顺利。 但是当我添加这段代码时,它失败了:

it("contains init", function(){
    expect(mod.init).toBeDefined();
});

我不明白为什么。

1 个答案:

答案 0 :(得分:2)

您没有正确使用RequireJS。

以下解决方案需要使用beforeAll,可以使用this package将其添加到Jasmine中。你的代码可能是这样的:

describe("ModuleName", function() {
    var mod;

    beforeAll(function (done) {
        // This loads your module and saves it in `mod`.
        require(['../js/app/ModuleName'], function(mod_) {
            mod = _mod;
            done();
        });
    });

    it("exists", function(){
        expect(mod).toBeDefined();
        expect(mod.init).toBeDefined();
    });
});

我记得,使用依赖数组调用的require返回值是对require本身的引用。所以是的,它被定义但是,不,它不是您尝试加载的模块的值。要获得模块值,您必须执行类似于上面代码中的操作。

如果您的测试碰巧在RequireJS模块中,您也可以将要测试的模块添加到依赖项列表中:

define([..., '../js/app/ModuleName'], function (..., mod) {
    describe("ModuleName", function() {
        it("exists", function(){
            expect(mod).toBeDefined();
            expect(mod.init).toBeDefined();
        });
    });
});

我在不同情况下使用了上述两种方法。

附注:我已从上面代码中的模块名称中删除了.js。您通常不希望将.js扩展名放在您给RequireJS的模块名称上。