我使用Jasmine来测试我的一些代码。看起来有点像这样
# main logic
function Analytics() {
this.construct = function() {
}
this.foo = function() {
}
this.bar = function() {
}
}
# "main" routine, called by jQuery on ready, or direct by Jasmine
function analytics() {
new Analytics().construct();
}
# calls main routine
$(document).ready(function () {
analytics();
});
在浏览器中运行时,它可以正常工作。但是,当我想用Jasmine测试我的代码时(如果在调用analytics()时调用构造函数,它就会失败。
Expected spy construct to have been called. (1)
这是规范的样子:
it('should call the constructor when the document is ready', function({
var _analytics = new Analytics();
spyOn(_analytics, 'construct')
analytics(); # note this is the "main" routine
expect(_analytics.construct).toHaveBeenCalled();
})
我的测试用例似乎不正确,但我真的不知道如何。有没有人对这种行为有解释?
答案 0 :(得分:0)
正如我所看到的,来自代码" analytics" function创建了一个新的Analytics实例。
所以测试可能就是这样:
it('should call the constructor when the document is ready', function({
var _analytics = new Analytics(); // --> create new instance of Analytics
spyOn(_analytics, 'construct') // --> spy on construct func
analytics(); // --> This, creates new instance
// of analytics which you don't spy on.
expect(_analytics.construct).toHaveBeenCalled();
});
尝试通过原型间谍:
spyOn(Analytics.prototype, 'construct'); // will spy all instances.
测试将如下所示:
it('should call the constructor when the document is ready', function({
spyOn(Analytics.prototype, 'construct');
analytics();
expect(Analytics.prototype.construct).toHaveBeenCalled();
});
请注意,您无法访问在分析功能中创建的实例。
创建后您将无法使用它。
我不知道任务的背景。但也许你应该使用默认构造函数。
function Analytics(options) {
// this is constructor
this.prop1 = options.prop1;
this.prop2 = options.prop2;
this.foo = function() {
}
this.bar = function() {
}
}
var analyticsModule = new Analytics(options);