gpt4 book ai didi

javascript - Jest 中的 resetAllMocks、resetModules、resetModuleRegistry、restoreAllMocks 之间的区别

转载 作者:行者123 更新时间:2023-12-01 14:51:12 25 4
gpt4 key购买 nike

我试图在 Jest 中围绕以下内容:
resetAllMocks , resetModules , resetModuleRegistryrestoreAllMocks
我觉得很难。

我阅读了 Jest 文档,但不太清楚。如果有人可以为我提供上述工作方式的示例并且它们彼此不同,我将不胜感激。

最佳答案

以下部分解释了每个函数的行为及其相应的配置指令。在配置指令的情况下,解释的行为发生在每个测试之间,使它们与其他测试越来越隔离。
引用 fn在这些操作中的每一个下都暗示了一个示例 Jest 模拟函数。jest.clearAllMocks()clearMocks:[boolean]重置所有模拟使用数据,而不是它们的实现。换句话说,它只替换 fn.mock.callsfn.mock.instances Jest 模拟函数的属性。jest.resetAllMocks()resetMocks:[boolean]clearAllMocks() 的超集它还负责将实现重置为 no return功能。换句话说,它将用新的 jest.fn() 替换模拟函数。 ,而不仅仅是它的fn.mock.callsfn.mock.instances .jest.restoreAllMocks()restoreMocks:[boolean]类似于 resetAllMocks() ,有一个非常重要的区别。它恢复了“ spy ”的原始实现。因此,它就像“用 jest.fn() 替换模拟,但用它们的原始实现替换 spy ”。
因此,如果我们使用 jest.fn() (不是 spy )手动分配事物,我们必须自己处理实现恢复,因为 jest 不会这样做。jest.resetModules()resetModules:[boolean]它重置 Jest 的模块注册表,该注册表是所有必需/导入模块的缓存。调用 this 后,Jest 将重新导入任何必需的模块。想象一下,无需处理其他测试中所有模拟出的模块即可。jest.resetModuleRegistry它只是 resetModules 的别名, 看:
https://github.com/facebook/jest/blob/7f69176c/packages/jest-runtime/src/index.ts#L1147

了解清除、重置和恢复在操作上的不同之处:
https://repl.it/@sepehr/jest-mock-api-reset-restore#jest-mock-apis.test.js

PASS  ./jest-mock-apis.test.js

jest mock reset/restore api
when calling mockReset() on a test double with custom impl.
if the test double is a spy
✓ jest replaces the impl. to a new undefined-returning jest.fn() (18ms)
if the test double is "not" a spy
✓ jest replaces the impl. to a new undefined-returning jest.fn() (17ms)

when calling mockRestore() on a test double with custom impl.
if the test double is "not" a spy
✓ jest resets the impl. to a new undefined-returning jest.fn() (2ms)
if the test double is a spy
✓ jest restores the original impl. of that spy (7ms)

describe('jest mock reset/restore api', () => {

describe('when calling mockReset() on a test double with custom impl.', () => {
describe('if the test double is a spy', () => {
test('jest replaces the impl. to a new undefined-returning jest.fn()', () => {
const module = { api: () => 'actual' }
jest.spyOn(module, 'api').mockImplementation(() => 'spy mocked')

expect(module.api()).toStrictEqual('spy mocked')
expect(module.api).toHaveBeenCalledTimes(1)

module.api.mockReset()

expect(module.api()).toStrictEqual(undefined)
expect(module.api).toHaveBeenCalledTimes(1)
})
})


describe('if the test double is "not" a spy', () => {
test('jest replaces the impl. to a new undefined-returning jest.fn()', () => {
const api = jest.fn(() => 'non-spy mocked')

expect(api()).toStrictEqual('non-spy mocked')
expect(api).toHaveBeenCalledTimes(1)

api.mockReset()

expect(api()).toStrictEqual(undefined)
expect(api).toHaveBeenCalledTimes(1)
})
})
})

describe('when calling mockRestore() on a test double with custom impl.', () => {
describe('if the test double is "not" a spy', () => {
test('jest resets the impl. to a new undefined-returning jest.fn()', () => {
const api = jest.fn(() => 'non-spy mocked')

expect(api()).toStrictEqual('non-spy mocked')
expect(api).toHaveBeenCalledTimes(1)

api.mockRestore()

expect(api()).toStrictEqual(undefined)
expect(api).toHaveBeenCalledTimes(1)
})
})

describe('if the test double is a spy', () => {
test('jest restores the original impl. of that spy', () => {
const module = { api: () => 'actual' }
jest.spyOn(module, 'api').mockImplementation(() => 'spy mocked')

expect(module.api()).toStrictEqual('spy mocked')
expect(module.api).toHaveBeenCalledTimes(1)

module.api.mockRestore()

expect(module.api()).toStrictEqual('actual')
expect(module.api).not.toHaveProperty('mock')
})
})
})
})

关于javascript - Jest 中的 resetAllMocks、resetModules、resetModuleRegistry、restoreAllMocks 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58151010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com