2017-02-27 75 views
0

我試圖在測試獨立模塊時模擬導入模塊中的方法。我能夠使用ES2015導入語法成功模擬導入的模塊,但模擬在整個測試過程中保持一致,並且有些情況下我想要更改模擬。在Jest單元測試中重置模擬模塊的值

我的文件看起來像這樣

// ModuleA 
import ModuleB from 'ModuleB' 

// ... code 

// TestCase 
import ModuleA from 'ModuleA' 
import ModuleB from 'ModuleB' 

jest.mock('ModuleB',() => { 
    return { 
    value: true 
    } 
} 

describe('ModuleA',() => { 
    it('returns true',() => { 
    // This test expects ModuleB.value to return true 
    }); 

    it('returns false',() => { 
    // This doesn't work 
    ModuleB.value = jest.fn(() => false) 
    // This doesn't work either 
    jest.mock('ModuleB',() => { 
     return { 
     value: false 
     } 
    }); 
    // This test expects ModuleB.value to return false in order to pass 
    }); 
}); 

我essentailly需要爲ModuleB分離嘲笑。在過去,我可以簡單地使用var ModuleB = require('ModuleB');而不是import,然後在需要時撥打ModuleB.someMethodName = jest.fn()。我只想在這些測試中只使用ES2015,並且使用剛纔提到的模式給我一個ModuleB is read-only錯誤。

回答

0

使用requireActual方法:

爲了確保人工模擬和真正落實保持同步,它可能是需要使用require.requireActual(MODULENAME)真正的模塊中的人工模擬有用在導出之前用模擬函數修改它。

例如:

const RealModule = require.requireActual('Form'); 
    const MyModule = { 
    RealThing: RealModule.RealThing, 
    …add some mocks 
    }; 

參考