当前位置: 首页 > 知识库问答 >
问题:

如何在Jest中模拟模块未模拟时导入的命名函数

姬安志
2023-03-14

null

// myModule.js

export function otherFn() {
  console.log('do something');
}

export function testFn() {
  otherFn();

  // do other things
}

如上所示,它导出了一些命名函数,而且重要的是 使用了

开玩笑地说,当我为 编写单元测试时,我希望模拟 函数,因为我不希望 中的错误影响我为 编写的单元测试。我的问题是我不确定最好的方法是:

// myModule.test.js
jest.unmock('myModule');

import { testFn, otherFn } from 'myModule';

describe('test category', () => {
  it('tests something about testFn', () => {
    // I want to mock "otherFn" here but can't reassign
    // a.k.a. can't do otherFn = jest.fn()
  });
});

如有任何帮助/洞察力,我们将不胜感激。

共有3个答案

农波涛
2023-03-14

null

只需要使用模块调用

如果 使用模块调用 ,则可以对 的模块导出进行模拟,并且 将调用模拟。

null

myModule.js

import * as myModule from './myModule';  // import myModule into itself

export function otherFn() {
  return 'original value';
}

export function testFn() {
  const result = myModule.otherFn();  // call otherFn using the module

  // do other things

  return result;
}

myModule.test.js

import * as myModule from './myModule';

describe('test category', () => {
  it('tests something about testFn', () => {
    const mock = jest.spyOn(myModule, 'otherFn');  // spy on otherFn
    mock.mockReturnValue('mocked value');  // mock the return value

    expect(myModule.testFn()).toBe('mocked value');  // SUCCESS

    mock.mockRestore();  // restore otherFn
  });
});
邴烨
2023-03-14
import m from '../myModule';

null

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

m.otherFn = jest.fn();
仲孙文乐
2023-03-14

返回实际模块而不是模拟模块,绕过对模块是否应接收模拟实现的所有检查。

我更喜欢这种简洁的用法,您需要并在返回的对象中扩展:

// myModule.test.js

jest.mock('./myModule.js', () => (
  {
    ...(jest.requireActual('./myModule.js')),
    otherFn: jest.fn()
  }
))

import { otherFn } from './myModule.js'

describe('test category', () => {
  it('tests something about otherFn', () => {
    otherFn.mockReturnValue('foo')
    expect(otherFn()).toBe('foo')
  })
})

Jest's Manual Mocks文档中也引用了此方法(在示例的末尾):

为了确保手动模拟和它的真实实现保持同步,要求真实模块在手动模拟中使用 ,并在导出之前使用模拟函数对其进行修改可能是有用的。

 类似资料:
  • 问题内容: 我开始认为这是不可能的,但是无论如何我都想问。 我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易- 应用程式码: 和测试代码: 笑话相当于什么?我觉得这是一件很想做的简单的事,但是我一直在努力尝试弄清头发。 我最接近的是将s 替换为s,并将其移入测试/函数中。都不是我想做的事情。 为了获得加分,我希望在其中的功能为默认导出时使整个工作正常进行。但是,我知

  • 问题内容: 我正在编写pytest插件,该插件应测试旨在在一组特定环境中运行的软件。 我正在编写的软件在一个更大的框架内运行,这使某些Python模块仅在框架内运行我的Python软件时可用。 为了测试我的软件,我需要“模拟”或伪造整个模块(实际上是很多模块)。我需要以某种类似的方式实现其功能,但是我的问题是,如何使用py.test插件将该虚假的Python模块提供给我的软件代码? 例如,假设我的

  • 问题内容: 我想了解如何从导入的模块执行功能。 这是我到目前为止的位置。 app / mocking.py: app / my_module / init.py: 测试/模拟测试.py: 这不 符合 我的预期。“已修补”模块仅返回的未模拟值。如何模拟要导入到被测名称空间中的其他包中的方法? 问题答案: 当您从包中使用装饰器时,您 未在 修补名称空间(从本例中导入模块),而是在被测试的名称空间中对其

  • 问题内容: 我的测试目标中当前已导入: 并在我的相同测试目标中使用它: 在测试中,我正在做以下模拟尖锐函数的操作: 但我得到: 有没有一种方法可以使用带有Jest的功能模拟所有Sharp模块功能? 问题答案: 您需要像这样模拟它: 首先,您需要返回function而不是对象,因为您需要调用。该函数调用将返回带有键的对象,该键包含另一个函数,依此类推。 要测试每个功能,您需要为每个功能创建一个间谍。

  • 我正在开发一个React应用程序,我想测试一个模块,我们称之为B,这取决于另一个模块,我们称之为a。 场景可能是这样的: 测试我的组件的核心库是Jest和Ezyme。我的目标是测试模块B,但我想单独测试它,所以我想模拟对模块A的依赖。js。 我知道一种方法是注入helperFn作为道具,而不是导入它,这样在测试期间我就可以注入一个模拟函数,但是这个应用程序上有很大的模块,每个模块都有一些依赖关系。

  • 问题内容: 模块包括在其顶部。然而在试验条件下,我想嘲笑 的(模拟)和进口完全避免。 实际上,并不是故意在测试环境中安装的。 是被测单元。我必须导入所有功能。是我需要模拟的模块。但我怎么能嘲笑之内,并停止从导入实际,如果第一件事情确实是进口? (未安装B的原因是我使用pypy进行了快速测试,但不幸的是B尚未与pypy兼容。) 怎么办呢? 问题答案: 您可以在导入之前分配给以获取所需的内容: tes