每次测试都是Mock模块

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每次测试都是Mock模块相关的知识,希望对你有一定的参考价值。

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

有没有办法实现这个目标?因为导入只能在文件的顶部,并且能够模拟在导入之前必须声明的内容。我也尝试传递一个本地函数,所以我可以覆盖行为但是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)
})

在内部你可以想象theThingToTest.someAction()使用the-package-to-mock.methodToMock

答案

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

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')
})
另一答案

spyOn最适合我们。见上一个答案:

https://stackoverflow.com/a/54361996/1708297

另一答案

我使用以下模式:

'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来描述返回模拟时将返回的内容

以上是关于每次测试都是Mock模块的主要内容,如果未能解决你的问题,请参考以下文章

python mock模块使用

快速入门JAVA单元测试——mock

快速入门JAVA单元测试——mock

快速入门JAVA单元测试——mock

Python——单元测试中mock原理和使用

CTS测试CtsWindowManagerDeviceTestCases模块的testShowWhenLockedImeActivityAndShowSoftInput测试fail项解决方法(代码片段