重新定义对象上的方法

时间:2010-10-22 03:08:21

标签: javascript

我正在尝试执行以下操作:

//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中重新定义实例方法?

1 个答案:

答案 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更灵活/可配置的重大胜利。