从不同对象调用方法时,开玩笑spyOn toHaveBeenCalled失败

时间:2019-11-12 17:59:19

标签: jestjs

我尝试检查回调,但JEST没有注意到它被调用。

我将其深入研究的非常简单的案例。调用类N的Object对象的方法将调用类D的回调对象d。它发生-我确实看到了输出,但Jest无法识别它。

即我希望选项1和选项2都能通过测试,但实际上只有选项2成功。尽管https://jestjs.io/docs/en/jest-object#jestspyonobject-methodname上的文档说

,但Jest似乎正在检查被调用的名称
  

注意:默认情况下,jest.spyOn还会调用spied方法。

class D{
   callback(id){
      console.log("called with "+id);
   }
}

class N{

   constructor(){
      this.callback = undefined;
   }

   callEm(id){
      this.callback(id);
   }

}
var c = new N();
var d = new D();
c.callback = d.callback;

const spy = jest.spyOn(d, "callback");
c.callEm("crap"); // Option1: leads to test failure but shows print out
//d.callback("crap");// Option2: leads to test success and shows print out

expect(spy).toHaveBeenCalledTimes(1);

1 个答案:

答案 0 :(得分:1)

需要更改:

  • 监视D.prototype而不是d
  • 在分配回调之前添加间谍,即。 c.callback=d.callback

class D{
   callback(id){
      console.log("called with "+id);
   }
}

class N{

   constructor(){
      this.callback = undefined;
   }

   callEm(id){
      this.callback(id);
   }

}
var c = new N();
var d = new D();
const spy = jest.spyOn(D.prototype, "callback");
c.callback = d.callback;

c.callEm("crap"); 
d.callback("crap");

expect(spy).toHaveBeenCalledTimes(2);

更新: 对于此示例,您甚至可以执行const spy = jest.spyOn(d, "callback");,但这仅适用于该类的实例。