我正在尝试执行以下操作:
//Code under test
function Foo() {
this.do_something_interesting = function() {
var dependency = new CanYouMockMe();
if(dependency.i_want_stubbed() === true) {
//do stuff based on condition
} else {
//do stuff if false
}
}
}
//Test Code
describe("Foo", function () {
it("should do something if the dependency returns true", function () {
var foo = new Foo();
//how do I stub and/or redefine the "i_want_stubbed" method here?
var result_if_true = foo.do_something_interesting();
expect(true).toEqual(result_if_true);
});
});
问题的要点是:如何在javascript中重新定义实例方法?
答案 0 :(得分:2)
你的Foo.do_something_interesting演示了untestable /难以测试的代码的一个共同特征,即它使用“new”并且具有未传入的依赖项。理想情况下,你会:
do_something_interesting = function(dependency) {
// ...
}
在上面,用Mock替换你的依赖项要容易得多。也就是说,您可以使用给定实例或原型的属性来替换碎片。例如:
Foo.prototype.CanYouMockMe = function() {};
Foo.prototype.CanYouMockMe.prototype.i_want_stubbed = function() {
console.log("I'm a stub");
};
您可以在覆盖它们之前保存属性,然后在测试用例之后恢复这些属性,以便可以相互隔离地运行多个测试。也就是说,明确依赖关系是可测试性和使API更灵活/可配置的重大胜利。