我是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();
});
我不明白为什么。
答案 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的模块名称上。