簡體   English   中英

Jest:模擬第三方模塊

[英]Jest: Mocking third-party modules

我最近一直在嘗試使用 Jest 學習單元測試,閱讀文檔和各種文章。

我無法弄清楚的一件事是:

我正在嘗試測試一個以os.platform()條件的if語句的 nodeJS 模塊。

我的測試有什么方法可以將os.platform返回值設置/模擬為os.platform值,因此當 Jest 運行測試文件時,測試文件將讀取測試套件中指定的 os.platform() 值?

PS: foo()不能通過依賴注入接受平台。 foo()的實現是固定的。

我的模塊.js

import os from 'os';
export const foo = () => {
  if (os.platform() === `win32`) {
    module = module.split(`\\`).join(`\\\\`);
  }
}

myModule.test.js

import * as myModule from '../myModule.js';

// Guessing I need to use spyOn, to test the actual module code?
const myModuleMock = jest.spyOn(myModule, 'foo');

describe('myModule', () => {
  it('can run with different os.platform() values', () => {
    myModuleMock();
    expect(myModuleMock).toHaveBeenCalled();
    // How do I specify what value os.platform() in foo() should return?
  });
});

您可以將os導入您的測試文件並使用jest.spyOn像這樣模擬它:

import * as myModule from '../myModule.js';
import os from 'os';

describe('myModule', () => {
  it('can run with different os.platform() values', () => {
    const spy = jest.spyOn(os, 'platform');
    spy.mockReturnValue('mocked response');  // <= mock the return value

    myModule.foo();

    expect(spy).toHaveBeenCalled();  // Success!
  });
});

我更喜歡這種方法,因為它使模擬更接近它所影響的測試。


如果你想使用帶有工廠函數的jest.mock那么你可以這樣做:

jest.mock('os', () => { 
  const os = jest.requireActual('os');
  jest.spyOn(os, 'platform').mockReturnValue('mocked response');
  return os;
});

請注意,工廠函數必須是完全獨立的。

您可以通過在__mocks__目錄上添加os.js文件來模擬os模塊:

// ./__mocks__/os.js
const os = jest.requireActual('os')

os.platform = jest.fn().mockReturnValue('testPlatform')
module.exports = os

// ./tests/whatever/some.test.js
import os from 'os'

jest.mock('os')

test('os', () => {
  expect(os.platform()).toBe('testPlatform') // ✔️
})

或者,只有一個文件:

const mockOS = jest.requireActual('os')
mockOS.platform = jest.fn().mockReturnValue('testPlatform')
jest.mock('os', () => mockOS)

import os from 'os'

test('os', () => {
  expect(os.platform()).toBe('testPlatform')
})

所以你的測試文件應該是這樣的:

const mockOS = jest.requireActual('os')
mockOS.platform = jest.fn().mockReturnValue('testPlatform')
jest.mock('os', () => mockOS)


import * as myModule from '../myModule.js';

describe('myModule', () => {
  it('can run with different os.platform() values', () => {
    myModuleMock();
    expect(myModuleMock).toHaveBeenCalled();
  });
});```

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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