javascript - Jasmine:如何监视内部对象方法调用?

标签 javascript unit-testing testing bdd jasmine

我有两个原型(prototype)要测试:

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() method does not exist
  • getAge() method does not exist
  • Expected spy getAge to have been called

那么,是否有任何方法可以使用 Jasmine 测试此类情况,如果是的话 - 如何完成?

最佳答案

你已经监视了 Child 对象的原型(prototype)。

describe("Person", function () {
  it("calls the getAge() function", function () {
    var spy = spyOn(Child.prototype, "getAge");
    var fakePerson = new Person();
    fakePerson.pingChild();
    expect(spy).toHaveBeenCalled();
  });
});

关于javascript - Jasmine:如何监视内部对象方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18483959/

相关文章:

testing - 使用 peewe 和 PyTest 测试 Flask-Security 时数据库没有改变

javascript - 在 jQuery 之后加载的脚本中获取 "$ is not defined"

javascript - 在不创建 html/javascript 测试文件的情况下在浏览器中测试 JavaScript 脚本

javascript - 为什么这个 Twitter 脚本标签尝试评估为真?有关系吗?

unit-testing - MSTest 中的 TeSTList 与播放列表

multithreading - 如何测试跨线程队列?

java - 我不能将我的 Mocked 类文件放在 src/main/test 文件夹中?

javascript - Vuejs - 将原始 html 链接渲染到 <router-link>

javascript - 如何在 JavaScript 中将 bool 属性设置为 "default"?