Jasmine - how to spyOn instance methods

前端 未结 2 426
耶瑟儿~
耶瑟儿~ 2020-12-16 10:23

I have a function

var data = {};
var myFunc = function() {
  data.stuff = new ClassName().doA().doB().doC();
};

I\'d like to test that

2条回答
  •  醉梦人生
    2020-12-16 10:57

    Where you went wrong was your understanding of how to refer to methods in JavaScript in a static context. What your code is actually doing is spying on ClassName.doA (that is, the function attached to the ClassName constructor as the property doA, which is not what you want).

    If you want to detect when that method gets called on any instance of ClassName anywhere, you need to spy on the prototype.

    beforeEach(function() {
      spyOn(ClassName.prototype, 'doA');
    });
    it('should call doA', function() {
      myFunc();
      expect(ClassName.prototype.doA).toHaveBeenCalled();
    });
    

    Of course, this is assuming that doA lives in the prototype chain. If it's an own-property, then there is no technique that you can use without being able to refer to the anonymous object in myFunc. If you had access to the ClassName instance inside myFunc, that would be ideal, since you could just spyOn that object directly.

    P.S. You should really put "Jasmine" in the title.

提交回复
热议问题