簡體   English   中英

開玩笑模擬默認導出 - 需要與導入

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM