代码之家  ›  专栏  ›  技术社区  ›  Steve Horn

重新定义对象上的方法

  •  0
  • Steve Horn  · 技术社区  · 15 年前

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

    //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);
      });
    });
    

    1 回复  |  直到 15 年前
        1
  •  2
  •   Michael Aaron Safyan    15 年前

    Foo.do_一些有趣的东西演示了不稳定/难以测试的代码的一个常见特性,即它使用“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");
     };