我有一个功能
var data = {};
var myFunc = function() {
data.stuff = new ClassName().doA().doB().doC();
};
我想测试doA
,doB
和doC
都被调用。
我试图监视像这样的实例方法
beforeEach(function() {
spyOn(ClassName, 'doA');
};
it('should call doA', function() {
myFunc();
expect(ClassName.doA).toHaveBeenCalled();
});
但这只是给了我一个“doA()方法不存在”的错误。
有什么想法吗?
答案 0 :(得分:33)
您出错的地方是您对如何在静态上下文中引用JavaScript中的方法的理解。你的代码实际上在做什么是监视ClassName.doA
(即ClassName
构造函数作为属性doA
附加的函数,这不是你想要的。)
如果要检测何时在ClassName
的任何实例上调用该方法,您需要监视原型。
beforeEach(function() {
spyOn(ClassName.prototype, 'doA');
});
it('should call doA', function() {
myFunc();
expect(ClassName.prototype.doA).toHaveBeenCalled();
});
当然,这是假设doA
生活在原型链中。如果它是一个自己的属性,那么没有技术可以使用,而无法引用myFunc
中的匿名对象。如果您有权访问ClassName
内的myFunc
实例,那将是理想的,因为您可以直接spyOn
该对象。
P.S。你应该把“Jasmine”放在标题中。
答案 1 :(得分:7)
让我们做一些代码重构,因为我们想要实现构造函数注入模式,因为James Shore提到:
依赖注入意味着为对象提供自己的实例变量。真。就是这样。
var data = {};
var stuff = new ClassName()
var myFunc = function(stuff) { // move step of creation new object outside
data.stuff = stuff.doA().doB().doC();
};
一些测试的时间
function ClassName() {
}
var data = {};
var stuff = new ClassName()
var myFunc = function(stuff) {
data.stuff = stuff.doA().doB().doC();
};
describe('stub for ClassName implementation', function() {
var stubStuff = {
doA: function() {
return stubStuff
},
doB: function() {
return stubStuff
},
doC: function() {
return stubStuff
}
}
beforeEach(function() {
spyOn(stubStuff, 'doA').and.callThrough();
});
it('calls "doA" on "myFunc" exection', function() {
myFunc(stubStuff);
expect(stubStuff.doA).toHaveBeenCalled();
});
});
<link href="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine.css" rel="stylesheet" />
<script src="//safjanowski.github.io/jasmine-jsfiddle-pack/pack/jasmine-2.0.3-concated.js"></script>