我想测试两个原型:
var Person = function() {};
Person.prototype.pingChild = function(){
var boy = new Child();
boy.getAge();
}
var Child = function() {};
Child.prototype.getAge = function() {
return 42;
};
我想测试的是什么:检查getAge()
方法内部是否调用了pingChild()
方法
这是我试图用于此目的的Jasmine规范:
describe("Person", function() {
it("calls the getAge() function", function() {
var fakePerson = new Person();
var chi = new Child();
spyOn(fakePerson, "getAge");
fakePerson.pingChild();
expect(chi.getAge).toHaveBeenCalled();
});
});
describe("Person", function() {
it("calls the getAge() function", function() {
var fakePerson = new Person();
spyOn(fakePerson, "getAge");
fakePerson.pingChild();
expect(fakePerson.getAge).toHaveBeenCalled();
});
});
describe("Person", function() {
it("calls the getAge() function", function() {
var fakePerson = new Person();
var chi = new Child();
spyOn(chi, "getAge");
fakePerson.pingChild();
expect(chi.getAge).toHaveBeenCalled();
});
});
但所有这些都只显示错误:
- getAge()方法不存在
- getAge()方法不存在
- 预期的间谍getAge被称为
那么,有没有办法用Jasmine测试这样的情况,如果是的话 - 怎么办呢?
答案 0 :(得分:9)
你必须监视Child
对象的原型。
describe("Person", function () {
it("calls the getAge() function", function () {
var spy = spyOn(Child.prototype, "getAge");
var fakePerson = new Person();
fakePerson.pingChild();
expect(spy).toHaveBeenCalled();
});
});
答案 1 :(得分:2)
我认为这是不可能的,因为内部对象不能从父对象外部访问。这完全取决于对象的范围。
您可以通过以下方式在Child
对象中公开Person
对象:
var Person = function() {
this.boy = new Child();
};
Person.prototype.pingChild = function(){
this.boy.getAge();
}
然后:
describe("Person", function() {
it("calls the getAge() function", function() {
var fakePerson = new Person();
var chi = fakePerson.boy;
spyOn(chi, "getAge");
fakePerson.pingChild();
expect(chi.getAge).toHaveBeenCalled();
});
});
或者委托Child
对象外的Person
初始化:
var Person = function(child) {
this.boy = child;
};
Person.prototype.pingChild = function(){
this.boy.getAge();
}
然后:
describe("Person", function() {
it("calls the getAge() function", function() {
var chi = new Child();
var fakePerson = new Person(chi);
spyOn(chi, "getAge");
fakePerson.pingChild();
expect(chi.getAge).toHaveBeenCalled();
});
});