2016-07-05 110 views
0

我有一個非常簡單的單元測試,看起來像這樣:開玩笑懲戒方法

import ApiWrapper from '../../services/api_wrapper'; 
jest.unmock('../helper') 

describe('Helper',() => { 
    let Helper; 

    beforeEach(() => { 
     Helper = require('../helper').default; 
    }); 

    it('calls the Api Wrapper',() => { 
     Helper.help() 

     expect(ApiWrapper.help).toHaveBeenCalled(); 
    }); 

}); 

當助手看起來是這樣的:

import ApiWrapper from '../services/api_wrapper' 
class Helper { 
    help() { 
     ApiWrapper.help() 
    } 
} 

export default new Helper(); 

而且ApiWrapper看起來是這樣的:

class ApiWrapper { 
    static help() { 
    console.log('help!') 
    } 
} 
export default ApiWrapper; 

ApiWrapper.help()被Jest嘲笑,所以'help!'從未打印過,但測試期望失敗。

export default { 
    help:() => { console.log('help!'); } 
} 

但是,由於它的工作原理,如果我們改變了進口規範(所以ApiWrapper在beforeEach進口),並重寫ApiWrapper:如果我們改寫ApiWrapper僅僅是一個普通的JavaScript對象像這樣仍然失敗成爲一個Singleton類,如下所示:

class ApiWrapper { 
    help() { 
     console.log('help!'); 
    } 
}(); 

export default new ApiWrapper(); 

這是什麼使Jest的嘲笑行爲成爲現實?

+1

有關線程的一些更多信息從這個問題:https://github.com/facebook/jest/issues/1245 – eebbesen

回答

0

如果您將require('../helper').default;移動到beforeEach()以外,它會工作嗎?

您無需在每次測試前初始化它。但是,我會將ApiWrapper.help.mockClear()放在beforeEach()中以重置模擬呼叫。