Javascript Jasmine的spyOn toHaveBeenCalled方法的问题

Javascript Jasmine的spyOn toHaveBeenCalled方法的问题,javascript,tdd,jasmine,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("call

有人能告诉我为什么下面的测试失败了吗

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();
  });
});
我从他那里拿的,他说有用。我可以看到spyOn方法正在person对象上创建一个同名的包装函数,即fakePerson.sayHello正在对象上调用,而不是在原型上调用


非常感谢

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

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的文档页面:

编辑:快速查看将显示以下内容:

警告

jasmine sinon目前会覆盖任何用于其自身间谍功能的同名jasmine matchers。我计划允许将来有选择地保留这些文件

被覆盖的本机Jasmine匹配器包括:

被装 与…相聚 如果你想使用jasmine sinon,你必须使用他们的API,而不是jasmine的API

编辑:截至:

你也可以使用茉莉花间谍和你的西农间谍。 jasmine sinon将检测您正在使用的匹配器,并使用相应的匹配器


测试用例的一个可能问题是,您没有指定应该调用原始方法。正确的行为是以下注意事项:

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的文档页面:

编辑:快速查看将显示以下内容:

警告

jasmine sinon目前会覆盖任何用于其自身间谍功能的同名jasmine matchers。我计划允许将来有选择地保留这些文件

被覆盖的本机Jasmine匹配器包括:

被装 与…相聚 如果你想使用jasmine sinon,你必须使用他们的API,而不是jasmine的API

编辑:截至:

你也可以使用茉莉花间谍和你的西农间谍。 jasmine sinon将检测您正在使用的匹配器,并使用相应的匹配器


测试失败了,因为我还使用了jasmine-sinon.js

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

@screenm0nkey在这种情况下,您能否更具体地说明您的期望以及测试失败时您会遇到什么错误。嗯,我希望测试能够通过,因为它应该通过。间谍没有正常工作,因为我从中复制了示例,它也失败了。我想我的设置有问题。嗨,你好。见我在原始帖子下面的评论。这与jasmine sinon.js.+1 for and callthrough@screenm0nkey有关。在这种情况下,你能更具体地说明你期望的是什么,以及测试失败时会出现什么错误。我希望测试通过,因为它应该通过。间谍没有正常工作,因为我从中复制了示例,它也失败了。我想我的设置有问题。嗨,你好。见我在原始帖子下面的评论。这与jasmine-sinon.js有关。对于andcall来说+1通过测试失败,因为我也在使用jasmine-sinon.js。还不知道为什么,但我一删除它,测试就开始工作了。嗨,screenm0nkey,你可能会感兴趣,为什么我认为在这个用例中使用ToHaveBeenCall不是最好的选择:测试失败是因为我也在使用jasmine-sinon.js。还不知道为什么,但我一删除它,测试就开始工作了。嗨,screenm0nkey,你可能会感兴趣,为什么我认为在这个用例中使用ToHaveEnCall不是最好的选择:谢谢你更新这个,我一直在看我在spy上犯了什么错误,只要我切换到它工作的sinon语法。我没有意识到这个项目使用的是sinon。这段代码是否应该像普通jasmine语法一样使用sinon或不使用sinon?谢谢你更新这段代码,我一直在关注spy的错误,只要我切换到sinon语法,它就可以工作了。我没有意识到这个项目使用的是sinon。这段代码不应该像常规jasmine语法一样使用sinon还是不使用sinon?