【问题标题】:jest spyOn toHaveBeenCalled fail when method is invoked from different object当从不同的对象调用方法时,jest spyOn toHaveBeenCalled 失败
【发布时间】:2020-03-08 11:44:59
【问题描述】:

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

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

即我希望选项 1 和选项 2 都能通过测试,但实际上只有选项 2 成功。似乎 Jest 可能正在检查被调用的名称,尽管 https://jestjs.io/docs/en/jest-object#jestspyonobject-methodname 上的文档说

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

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

【问题讨论】:

    标签: jestjs


    【解决方案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");,但这仅适用于该类的实例。

    【讨论】:

    • 谢谢。我意识到间谍在类而不是实例上。还有一种方法可以检查特定实例而不是任何实例上的调用吗?
    • const spy = jest.spyOn(c, 'callback'); 为我工作。如果您执行const spy = jest.spyOn(d, 'callback'); ,则调用两次,因为我们分配给 c.callback
    猜你喜欢
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 2019-08-09
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多