2017-10-13 87 views
0

我們在使用Jest進行單元測試時遇到了令人困擾的錯誤。Jest無法窺探對象

問題玩笑不進入內對象的方法

的情況下:有一個lol對象與和b()方法,如果我們直接調用B法,玩笑失敗,如果我們把它稱爲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內部替換對象的方法均可進行間諜功能 - 間諜功能「附着」於對象時,它不換行原有的功能到哪個對象屬性點。如果您對lol.b方法設置的間諜玩笑做這樣的事情(當然下面的代碼是巨大的簡化,只是爲了表明總體思路):

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

let lol = { 
    b: b 
}; 

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

所以,如果你現在打電話b()直接玩笑間諜是完全不知道的這是因爲jestSpyFunction在這種情況下不會被調用 - 僅當您使用lol.b()時纔會調用它。
所以在我看來你的第二個lol的實現是正確的,它應該這樣做,使代碼可測試。此外,您將ab函數定義爲'private'(匿名函數內部),因此無法從外部作用域(即使是Jest間諜)訪問它們是正確的和預期的行爲。