我想监视构造函数并告诉它使用jasmine调用了多少次。我通常会做这样的事情来定位一个对象的方法:
spyOn(lib,'methodName')
但是在我试图窥探实际构造函数的情况下,我已经尝试过了:
spyOn(lib);
it('lib should be instantiated for each matching element', function () {
spyOn(lib);
expect(lib.calls.count()).toEqual(2);
});
不幸的是,这只是在控制台中出现错误:
"Error: undefined() method does not exist in ..."
我怎样才能窥探构造函数?
答案 0 :(得分:13)
spyOn()
函数只能替换对象属性,因此您唯一能做的就是监视原型。现在,如果您要监视真实类的原型,它会干扰其他测试,因此您必须使用原型继承。
您可以这样做:
var mockClass = function (Subject) {
var Surrogate = function () {
Surrogate.prototype.constructor.apply(this, arguments);
};
Surrogate.prototype = Object.create(Subject.prototype);
Surrogate.prototype.constructor = Subject;
return Surrogate;
};
一些测试:
var My = function (a) {
this.init(a);
};
My.prototype = {
init: function (a) {
this.setA(a);
},
setA: function (a) {
this.a = a;
}
};
var Mock = mockClass(My);
spyOn(Mock.prototype, "constructor").andCallThrough();
spyOn(Mock.prototype, "init");
var m = new Mock(1);
expect(Mock.prototype.init).toBe(m.init);
expect(My.prototype.init).not.toBe(m.init);
expect(m.constructor).toHaveBeenCalledWith(1);
expect(m.init).toHaveBeenCalledWith(1);
expect(m.a).toBeUndefined();
m.setA(1);
expect(m.a).toBe(1);
spyOn(Mock.prototype, "setA").andCallFake(function (a) {
this.a = a + 1;
});
m.setA(1);
expect(m.setA).toHaveBeenCalledWith(1);
expect(m.a).toBe(2);
如果您的代码使用基于constructor
的类型检查,则无法监视x.constructor
。但我认为这只能通过集成测试和设计错误的代码来实现......