我有一些看起来像这样的代码:
var x = x || (function() {
// Some private variables
// ...
return {
init:function(options) {
// Do stuff
// ...
},
// Some other public methods
// ...
};
})();
如果我是对的,那么这是一个单身人士课程。现在我想用Jasmine为这个类编写一些单元测试。我从这样的事情开始:
describe("x", function() {
var myX;
beforeEach(function(){
myX = x;
});
it("has been instatiated correctly", function() {
expect(myX.init).toBeDefined();
});
});
我已经理解,因为最外面的function(){}
周围有括号,所以这个单例被实例化immediately after it has been parsed.在其余部分中没有调用这个单例的init
方法代码加强了我的假设(无论如何,这种情况下init
方法的意义是什么?)。
由此得出结论我知道
var myX;
beforeEach(function(){
myX = x;
});
不可能是对的。我已经尝试了很多其他的排列来得到一些东西(从完全放弃开始,因为我认为包含代码的文件已经在浏览器达到测试规范时被解析,所以单例类应该是的,对吗?)。但是一切都会导致完全相同的错误消息:
ReferenceError: x is not defined
那么我该如何解决这个问题呢?
提前致谢!
- 克里斯
答案 0 :(得分:0)
如果你没有定义x,你似乎没有包含模块代码。请告诉我们您如何在测试中嵌入它。
使用两个类型的断言,一个在实例化之前,一个在实例化之后,来测试一个单例:
function foo()
{
foo = {};
return 1;
}
console.assert(foo.constructor === Object, "foo.constructor === Function", 'foo should be a type of Function before it is instantiated')
foo();
console.assert(foo.constructor === Object, "foo.constructor === Object", 'foo should be a type of Object after it is instantiated')
<强>参考强>