繁体   English   中英

Jest:模拟第三方模块

Jest: Mocking third-party modules

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我最近一直在尝试使用 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?
  });
});
2 个回复

您可以将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();
  });
});```
1 如何使用Jest模拟第三方模块

我的测试目标中有当前导入: 并在我的同一测试目标中使用它: 在我的测试中,我在下面做了模拟尖锐的功能: 但我得到了: 有没有办法我们可以使用Jest功能模拟所有Sharp模块功能? ...

2 如何在 Jest/NestJS 中模拟第三方模块?

我有以下代码,我需要模拟connection.execute()函数,因为它属于第三方 lib snowflake-sdk并且不是我的单元测试的一部分: 所以我创建了以下单元测试: 但是connectionMock.execute没有被正确调用,因为我收到以下错误: 我想测试Snowfl ...

3 如何用 jest 模拟 angular/node 第三方模块

我正在尝试模拟整个ng-inline-svg模块(这是一个第三方 angular 模块)。 我尝试将以下代码放入我的 jest 全局模拟文件中: 但我收到以下错误消息: 有人可以帮忙并提供有关如何使用 jest 来模拟整个第三方模块的提示吗? ...

4 模拟第三方方法+jest

我正在使用 jest 进行后端单元测试。我需要使用它来模拟第三方库模块方法。我尝试了以下代码: 我的 controller 文件: test.spec.js 但它不是mocking,它调用了实际的库连接方法。 我在这里做错了什么。 请分享你的想法。 提前致谢。 工作代码 错误代码: 接收错误:T ...

5 如何使用 jest 模拟第三方库

我正在使用nestjs开发一个node.js应用程序我有一个名为LoggerService的类,如下所示 现在我正在使用 jest 为这个类编写单元测试,如下所示。 我的问题是如何检查(期望)是否logger.error ,或者如何在此类中模拟Rollbar 。 ...

7 如何使用 Jest 模拟第三方 React 组件?

TLDR; 模拟从第三方库导入的 React 组件的正确方法是什么? 我正在测试一个名为&lt;App/&gt;的组件。 它使用由名为localize-toolkit的库提供的名为&lt;Localize/&gt;的第三部分组件。 我在使用 Jest 模拟&lt;Localize/&gt;遇到 ...

9 如何使用 Jest 模拟第三方软件包?

我希望能够测试是否调用了这个Swal()函数。 它被嘲笑,但我不熟悉 Jest 嘲笑库。 这是在我的测试设置文件中: 所以我只希望它返回一个函数。 在我的组件中,Swal 是这样调用的: 我认为我的模拟需要返回一个命名方法,所以我可以监视它并检查它是否被调用。 我的测试: 错误: ...

10 React / Jest:如何模拟函数来自第三方包

我对使用Jest创建单元测试很陌生。 我正在尝试为使用第3方程序包的组件编写测试,该程序包可获取applanga(翻译)键。 还需要注意的一件事是,该函数是一个HOC,我觉得这很难模拟。 我得到的一些错误是translate is not a function或can't perfor ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM