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

如何更改模拟导入的行为?

王云
2023-03-14

我对如何对实现进行单元测试的笑话感到困惑。问题是我想模仿不同的预期行为。

有没有办法做到这一点?由于导入只能位于文件的顶部,并且为了能够模拟某些内容,必须在导入之前声明它。我还尝试传递一个本地函数,以便覆盖行为,但jest抱怨不允许传递任何本地函数。

jest.mock('the-package-to-mock', () => ({
  methodToMock: jest.fn(() => console.log('Hello'))
}));

import * as theThingToTest from '../../../app/actions/toTest'
import * as types from '../../../app/actions/types'

it('test1', () => {
  expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE)
})

it('test2', () => {
  //the-package-to-mock.methodToMock should behave like something else
  expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE)
})

就像你想象的ThingToTest一样。someAction()使用包进行模拟。方法检查

共有3个答案

宗政和韵
2023-03-14

另一种方法是使用jest.doMock(moduleName、工厂、选项)。

例如。

要模拟的包。ts

export function methodToMock() {
  return 'real type';
}

toTest。ts

import { methodToMock } from './the-package-to-mock';

export function someAction() {
  return {
    type: methodToMock(),
  };
}

toTest.spec.ts

describe('45006254', () => {
  beforeEach(() => {
    jest.resetModules();
  });
  it('test1', () => {
    jest.doMock('./the-package-to-mock', () => ({
      methodToMock: jest.fn(() => 'type A'),
    }));
    const theThingToTest = require('./toTest');
    expect(theThingToTest.someAction().type).toBe('type A');
  });

  it('test2', () => {
    jest.doMock('./the-package-to-mock', () => ({
      methodToMock: jest.fn(() => 'type B'),
    }));
    const theThingToTest = require('./toTest');
    expect(theThingToTest.someAction().type).toBe('type B');
  });
});

单元测试结果:

 PASS  examples/45006254/toTest.spec.ts
  45006254
    ✓ test1 (2016 ms)
    ✓ test2 (1 ms)

-----------|---------|----------|---------|---------|-------------------
File       | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-----------|---------|----------|---------|---------|-------------------
All files  |     100 |      100 |     100 |     100 |                   
 toTest.ts |     100 |      100 |     100 |     100 |                   
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        3.443 s

源代码:https://github.com/mrdulin/jest-v26-codelab/tree/main/examples/45006254

姜学海
2023-03-14

我使用以下模式

'use strict'

const packageToMock = require('../path')

jest.mock('../path')
jest.mock('../../../../../../lib/dmp.db')

beforeEach(() => {
  packageToMock.methodToMock.mockReset()
})

describe('test suite', () => {
  test('test1', () => {
    packageToMock.methodToMock.mockResolvedValue('some value')
    expect(theThingToTest.someAction().type).toBe(types.SOME_TYPE)

  })
  test('test2', () => {
    packageToMock.methodToMock.mockResolvedValue('another value')
    expect(theThingToTest.someAction().type).toBe(types.OTHER_TYPE)
  })
})

说明:

您模拟您试图在测试套件级别上使用的类,确保在每次测试之前重置模拟,并且对于每个测试,您使用mockResolveValue来描述返回模拟时将返回的内容

查学文
2023-03-14

您可以使用间谍模拟并导入模拟模块。在您的测试中,您使用mock实施设置mock的行为方式:

jest.mock('the-package-to-mock', () => ({
  methodToMock: jest.fn()
}));
import { methodToMock } from 'the-package-to-mock'

it('test1', () => {
  methodToMock.mockImplementation(() => 'someValue')
})

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

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

  • 假设您的代码正在使用一个模块,该模块使用来自该模块的的日志语句,而不是来自记录器实例的,并且您没有控制权来修改该模块正在使用中。 是否可以在不要求维护者修改代码的情况下为导入的模块自定义日志级别? 这些问题描述了一种非常简单的方法来更改特定模块的日志记录级别 如何禁用来自请求库的日志消息 Python日志记录-禁用导入模块的日志记录 下面的代码实现了所述的解决方案,只记录来自该模块的错误消息,但它

  • null 如上所示,它导出了一些命名函数,而且重要的是 使用了 。 开玩笑地说,当我为 编写单元测试时,我希望模拟 函数,因为我不希望 中的错误影响我为 编写的单元测试。我的问题是我不确定最好的方法是: 如有任何帮助/洞察力,我们将不胜感激。

  • 我最终得到。 我是否可以模拟并且在测试时仍然得到消息错误?

  • 问题内容: 我有一个 在IPython中,我使用: 然后,我将其更改为: 在IPython中,调用的结果仍然是: 然后我用: 我删除了同一个文件夹中存在的文件夹,但仍然没有运气。 我可以在运行时重新导入更新的代码吗? 问题答案: 对于Python 2.x 对于Python 3.x