【问题标题】:Issues with Jasmine's spyOn toHaveBeenCalled methodJasmine 的 spyOn toHaveBeenCalled 方法的问题
【发布时间】:2012-02-22 14:16:50
【问题描述】:

谁能告诉我为什么下面的测试失败了。

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。

非常感谢

【问题讨论】:

  • 测试失败,因为我也在使用 jasmine-sinon.js。不知道为什么,但是一旦我删除它,测试就会工作。
  • 嗨 screenm0nkey,您可能会感兴趣,为什么我认为在这个用例中使用 toHaveBeenCalled 不是最佳选择:stackoverflow.com/a/16851650/705888

标签: javascript tdd jasmine


【解决方案1】:

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

【讨论】:

  • 感谢您更新此内容,当我切换到它工作的 sinon 语法时,我一直在查看我在使用 spy 时做错了什么。我没有意识到这个项目正在使用 sinon。
  • 这段代码不应该像普通的茉莉花语法一样工作吗?
【解决方案2】:

您的测试用例的一个可能问题是您没有指定应该调用原始方法。以下是正确的行为(注意“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 的 API。

编辑:截至Feb 2012

你也可以在你的诗浓间谍旁边使用茉莉间谍。 jasmine-sinon 会检测你正在使用哪个并使用适当的匹配器。

【讨论】:

猜你喜欢
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 2012-01-18
  • 2020-10-08
  • 2014-10-29
  • 1970-01-01
相关资源
最近更新 更多