測驗兩個模塊,helper它使用render. 有可能render拋出,所以我在 中處理它helper,我希望測驗以確保它按預期作業。
當我最初撰寫測驗時,我在測驗本身中撰寫了該測驗所需的內容,包括模擬,使用jest.doMock. 一旦所有測驗都通過,我想重構以盡可能共享模擬。
所以這段代碼效果很好:
test('throws', async () => {
jest.doMock('./render', () => jest.fn(async () => { throw new Error('mock error'); }));
const helper = require('./helper');
expect(async () => { helper(); }).rejects.toThrow('mock error');
expect(log_bug).toHaveBeenCalled();
});
test('succeeds', async () => {
jest.doMock('./render', () => jest.fn(async () => 'rendered result'));
const helper = require('./helper');
expect(await helper()).toEqual(true); //helper uses rendered result but doesn't return it
expect(log_bug).not.toHaveBeenCalled();
});
然而,這并不是僅有的兩個測驗,到目前為止,模擬渲染的大多數其他測驗都希望它回傳其成功狀態。我試圖將成功用例重構為一個檔案,__mocks__/render.js如下所示:
// __mocks__/render.js
module.exports = jest.fn(async () => 'rendered result');
然后將我的測驗重構為這個,使其更加 DRY:
//intention: shared reusable "success" mock for render module
jest.mock('./render');
beforeEach(() => {
jest.resetModules();
jest.resetAllMocks();
});
test('throws', async () => {
//intention: overwrite the "good" render mock with one that throws
jest.doMock('./render', () => jest.fn(async () => { throw new Error('mock error'); }));
const helper = require('./helper');
expect(async () => { await helper(); }).rejects.toThrow('mock error');
expect(log_bug).toHaveBeenCalled();
});
test('succeeds', async () => {
//intention: go back to using the "good" render mock
const helper = require('./helper');
expect(await helper()).toEqual(true); //helper uses rendered result but doesn't return it
expect(log_bug).not.toHaveBeenCalled();
});
使用這個更新的測驗代碼,錯誤日志測驗仍然按預期作業——模擬被覆寫以導致它拋出——但是對于下一個測驗,錯誤再次拋出。
如果我顛倒這些測驗的順序以便模擬覆寫在最后,那么失敗就不會發生,但這顯然不是正確的答案。
我究竟做錯了什么?為什么在用 覆寫它后我無法正確重置我的模擬doMock?該doMock檔案做種說明什么,我試圖做的,但他們沒有表現出與正常手動嘲笑相混合。
uj5u.com熱心網友回復:
啊哈!我一直在挖掘,發現這個有點類似 Q A,這讓我嘗試了這種方法,而不是使用jest.doMock來覆寫測驗內部:
//for this one test, overwrite the default mock to throw instead of succeed
const render = require('./render');
render.mockImplementation(async () => {
throw new Error('mock error');
});
有了這個,無論它們運行的??順序如何,測驗都會通過!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/316771.html
標籤:javascript 测试 玩笑
