Jasmine的spyOn toHaveBeenCalled方法的问题

时间:2012-02-22 14:16:50

标签: javascript tdd jasmine

任何人都可以告诉我为什么以下测试失败。

var Person = function() {};

Person.prototype.helloSomeone = function(toGreet) {
  return this.sayHello() + " " + toGreet;
};

Person.prototype.sayHello = function() {
  return "Hello";
};

describe("Person", function() {
 it("calls the sayHello() function", function() {
   var fakePerson = new Person();
   spyOn(fakePerson, "sayHello");
   fakePerson.helloSomeone("world");
   expect(fakePerson.sayHello).toHaveBeenCalled();
  });
});

我是从here拿来的,他说它有效。我可以看到spyOn方法在person对象上创建了一个同名的包装函数,即在对象而不是原型上调用fakePerson.sayHello。

非常感谢

2 个答案:

答案 0 :(得分:8)

测试失败,因为我也在使用jasmine-sinon.js。

答案 1 :(得分:4)

您的测试用例可能存在的一个问题是您没有指定应该调用原始方法。具有正确行为的是以下(注意“andCallThrough”):

describe("Person", function() {
 it("calls the sayHello() function", function() {
   var fakePerson = new Person();
   spyOn(fakePerson, "sayHello").andCallThrough();
   fakePerson.helloSomeone("world");
   expect(fakePerson.sayHello).toHaveBeenCalled();
  });
});

您可以查看Jasmine的文档页面,了解有关其他可能性的更多信息:https://github.com/pivotal/jasmine/wiki/Spies

编辑:快速查看jasmine-sinon documentation会显示以下内容:

  
    

<强> <击>警告

         

jasmine-sinon目前覆盖了用于其自身间谍功能的任何同名Jasmine匹配器。我打算允许将来保留这些。

         

被覆盖的原生Jasmine匹配器是:

         
        
  • <击> toHaveBeenCalled()
  •     
  • <击> toHaveBeenCalledWith()
  •     
  

如果你想使用jasmine-sinon,你必须使用他们的API而不是Jasmine。

修改:从Feb 2012开始:

  

你也可以在你的Sinon间谍旁边使用Jasmine间谍。   jasmine-sinon将检测您正在使用哪个并使用适当的匹配器。