[英]Jest mocking default exports - require vs import
我在這里看到了關於用 jest 模擬默認導出的問題,但我認為這已經被問過了:
在模擬正在測試的模塊的依賴項的默認導出時,如果模塊使用 ES6 導入語句導入依賴項,則測試套件將無法運行,說明TypeError: (0 , _dependency.default) is not a function
It succeeds ,但是,如果模塊使用require().default
調用代替。
據我了解, import module from location
直接轉換為const module = require(location).default
,所以我很困惑為什么會這樣。 我寧願保持我的代碼風格一致,而不是在原始模塊中使用require
調用。
有沒有辦法做到這一點?
帶模擬的測試文件:
import './modules.js';
import dependency from './dependency';
jest.mock('./dependency', () => {
return {
default: jest.fn()
};
});
// This is what I would eventually like to call
it('calls the mocked function', () => {
expect(dependency).toHaveBeenCalled();
});
依賴.js
export default () => console.log('do something');
module.js(不工作)
import dependency from './dependency.js';
dependency();
module.js(工作)
const dependency = require('./dependency.js').default;
dependency();
您可以使用es6 import
或者require js
在您的jest測試中導入您的js文件。
使用es6 import
您應該知道jest正在嘗試解析所有依賴項,並且還調用要導入的類的構造函數。 在此步驟中,您無法模擬它。 必須成功解決依賴關系,然后才能繼續進行模擬。
我還應該補充一點, 這里可以看到jest默認情況下將任何jest.mocks提升到文件的頂部,這樣放置導入的順序並不重要。
你的問題雖然不同。 您的模擬函數假定您已使用require js
包含了js文件。
jest.mock('./dependecy', () => {
return {
default: jest.fn()
};
});
使用require js
導入文件時,這是它具有的結構:
因此,假設我使用require js
導入了名為“Test”的類,並且它有一個名為“doSomething”的方法,我可以通過執行以下操作在我的測試中調用它:
const test = require('../Test');
test.default.doSomething();
使用es6 import
,您應該采用不同的方式。 使用相同的例子:
import Test from '../Test';
Test.doSomething();
編輯:如果你想使用es6 import
更改您的模擬功能:
jest.mock('./dependecy', () => jest.fn());
你有沒有嘗試過這樣的事情? 幾個月來,我一直在處理默認導出模擬,直到我發現了這一點。
jest.mock('./dependency', () => () => jest.fn());
此行背后的想法是您正在導出一個作為函數的模塊。 所以你需要讓 Jest 知道它必須將你所有的./dependency
文件模擬為一個函數,它返回一個jest.fn()
如果您想使用import dependency from 'dependency'
項,則 ES 模塊的簡短答案
jest.mock('dependency', () => ({
...jest.requireActual('dependency'),
__esModule: true,
default: jest.fn(),
}))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.