Jestjs 当从不同对象调用方法时,jest spyOn toHaveBeenCalled失败

Jestjs 当从不同对象调用方法时,jest spyOn toHaveBeenCalled失败,jestjs,Jestjs,我试图检查回调,但JEST没有注意到它被调用 非常简单的情况下,我钻下来。调用类N的方法对象将调用类d的回调对象d。这种情况发生了-我确实看到了输出,但Jest没有识别它 也就是说,我希望选项1和选项2都能通过测试,但实际上只有选项2成功。似乎Jest可能正在检查被调用的名称,尽管上面的文档显示 注意:默认情况下,jest.spyOn还调用spied方法 所需更改: 监视D.prototype而不是D 在分配回调之前添加spy,即c.callback=d.callback D类{ 回拨(i

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

非常简单的情况下,我钻下来。调用类N的方法对象将调用类d的回调对象d。这种情况发生了-我确实看到了输出,但Jest没有识别它

也就是说,我希望选项1和选项2都能通过测试,但实际上只有选项2成功。似乎Jest可能正在检查被调用的名称,尽管上面的文档显示

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

所需更改:

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

D类{
回拨(id){
console.log(“用“+id”调用);
}
}
N类{
构造函数(){
this.callback=未定义;
}
被叫人(身份证){
这个.回调(id);
}
}
var c=新的N();
var d=新的d();
const spy=jest.spyOn(D.prototype,“回调”);
c、 callback=d.callback;
c、 卡勒姆(“垃圾”);
d、 回调(“垃圾”);
预期(间谍)。被催促的时间(2);
更新: 对于本例,您甚至可以执行
constspy=jest.spyOn(d,“回调”)但这仅适用于类的该实例。

需要更改:

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

D类{
回拨(id){
console.log(“用“+id”调用);
}
}
N类{
构造函数(){
this.callback=未定义;
}
被叫人(身份证){
这个.回调(id);
}
}
var c=新的N();
var d=新的d();
const spy=jest.spyOn(D.prototype,“回调”);
c、 callback=d.callback;
c、 卡勒姆(“垃圾”);
d、 回调(“垃圾”);
预期(间谍)。被催促的时间(2);
更新
对于本例,您甚至可以执行
constspy=jest.spyOn(d,“回调”)但这仅适用于该类实例。

谢谢。我意识到间谍是在类而不是实例上。还有一种方法可以检查对特定实例而不是对任何实例的调用吗?
constspy=jest.spyOn(c,“callback”)为我工作。如果您执行
constspy=jest.spyOn(d,'callback')然后调用两次,因为我们分配给c.Callback谢谢。我意识到间谍是在类而不是实例上。还有一种方法可以检查对特定实例而不是对任何实例的调用吗?
constspy=jest.spyOn(c,“callback”)为我工作。如果您执行
constspy=jest.spyOn(d,'callback')然后调用两次,因为我们分配给c.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();
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);