jest.spyOn不调用模拟实现,而是调用实际函数

hs1ihplo  于 2023-01-28  发布在  Jest
关注(0)|答案(1)|浏览(193)

我尝试为一个函数编写一个单元测试,这个函数调用同一个文件中的一些辅助函数,我使用jest.spyOn来模拟这些辅助函数,因为它似乎可以做到这一点。

我的模块.js

export const getUserName = () => {
    return "mjordan"
}

export const getItem = () => {
    return 'basketball'
}

export const getUserWithItem = () => {
    const userName = getUserName()
    const item = getItem()
    
    return userName + " " + item
}

我的模块.测试.js

import * as myModule from 'path/to/module'

describe('getUserWithItem', () => {
    beforeEach(() => {
        jest.restoreAllMocks()
    })

    it('Returns user with item', () => {
        jest.spyOn(myModule, 'getUserName').mockImplementation(() => 'tigerwoods')
        jest.spyOn(myModule, 'getItem').mockImplementation(() => 'golf ball')

        const result = myModule.getUserWithItem()

        expect(result).toEqual("tigerwoods golf ball")
    })
})

但是,jest.spyOn函数似乎没有模拟spied on函数的实现,而是测试调用了原始函数,结果输出为mjordan basketball
我是否遗漏了spyOn应该如何工作的一些内容?

polhcujo

polhcujo1#

我发现的最简单的方法是在模块中显式调用函数的导出版本,即

export const getUserName = () => {
    return "mjordan"
}

export const getItem = () => {
    return 'basketball'
}

export const getUserWithItem = () => {
    const userName = exports.getUserName()
    const item = exports.getItem()
    
    return userName + " " + item
}

相关问题