2017-10-13 13 views
0

ユニットテストにJestを使用しているときに邪魔なエラーが発生しました。Jestがオブジェクトにスパイすることができない

問題:は内部オブジェクトのメソッド

場合にアクセスしないでください冗談は:私たちは、直接Bメソッドを呼び出した場合、およびb()方法とlolオブジェクトがあります冗談私たちがlol.b()と呼んでも失敗します。

誰かがすでにこの問題に遭遇しましたか?より良い回避策がありますか?

コード:

describe('Jest bug',() => {  
    it('Jest fail',() => { 
     const lol = (() => { 
      const a =() => { 
       console.log("console a"); 
       b(); 
      }; 
      const b =() => { 
       console.log("console b"); 
      }; 
      return { 
       a, 
       b 
      }; 
     })(); 

     const spy = jest.spyOn(lol, 'b'); 

     lol.a(); 

     expect(spy).toHaveBeenCalled() 
    }); 

    it('Jest success',() => { 
     const lol = (() => { 
      const a =() => { 
       console.log("console OK a"); 
       lol.b(); 
      }; 
      const b =() => { 
       console.log("console OK b"); 
      }; 
      return { 
       a, 
       b 
      }; 
     })(); 

     const spy = jest.spyOn(lol, 'b'); 

     lol.a(); 

     expect(spy).toHaveBeenCalled() 
    }); 

}); 

答えて

0

冗談spyOnは、内部スパイ機能whithオブジェクトのメソッドを置き換える - スパイ機能がオブジェクトに「接続」され、どのプロパティポイントをオブジェクトには、元の関数をラップしません。あなたはlol.b法冗談にスパイを設定した場合は、この(コードの下はもちろん、巨大な簡素化され、単に一般的な考え方を示すことである)のようなものん:あなたは今b()を呼び出す場合

let b = function() { 
    ... 
}; 

let lol = { 
    b: b 
}; 

spyOn(lol, 'b'); 
//Jest internally does something like this 
lol.b = function jestSpyFunction() { 
    ... 
}; 

だから直接冗談スパイは完全に認識していませんこの場合はjestSpyFunctionが呼び出されないため、lol.b()を使用した場合にのみ呼び出されます。
私の操作では、lolの2番目の実装は正しいので、この方法でコードをテスト可能にする必要があります。また、abの機能を「プライベート」(匿名関数の内部)として定義しているため、(Jestのスパイであっても)外側のスコープからアクセスできないという正しい動作と意図された動作です。

関連する問題