Jestjs Jest mock未返回预期值

Jestjs Jest mock未返回预期值,jestjs,babel-jest,Jestjs,Babel Jest,我发现我正在使用的一个模拟将返回一个字符串,它似乎返回jest.fn(),而不是模拟的“实现”是jest.fn().mockImplementation(…) 我这样称呼它: const mockDefaultQuery = 'query { mock }' jest.mock('../functions', () => ( { getArticle: jest.fn().mockName('getArticle').mockImplementation(() => {

我发现我正在使用的一个模拟将返回一个字符串,它似乎返回
jest.fn()
,而不是模拟的“实现”是
jest.fn().mockImplementation(…)

我这样称呼它:

const mockDefaultQuery = 'query { mock }'
jest.mock('../functions', () => (
{
    getArticle: jest.fn().mockName('getArticle').mockImplementation(() => {
        return {}
    }),
    defaultQuery: jest.fn().mockImplementation(() => {
        return mockDefaultQuery
    })
})
)
但是从导入的“functions”库调用defaultQuery会在测试范围内返回[Function mockConstructor],而不是它应该返回的常量定义的“query{mock}”


我也尝试过使用
jest.fn().mockReturnValue(mockDefaultQuery)
,但没有效果。

问题是编译期间,
jest.mock
将被提升到测试文件的顶部。因此,您永远不能在模拟定义的模块范围内使用某些内容。所以你的代码是这样计算的

jest.mock('../functions', () => (
{
    getArticle: jest.fn().mockName('getArticle').mockImplementation(() => {
        return {}
    }),
    defaultQuery: jest.fn().mockImplementation(() => {
        return mockDefaultQuery
    })
})
)
const mockDefaultQuery = 'query { mock }'
在这种情况下,我通常会创建一个空的模拟,然后填充它:

jest.mock('../functions', () => jest.fn())
import myFunction from '../functions'
const mockDefaultQuery = 'query { mock }'
myFunction.mockImplementation( () => (
{
    getArticle: jest.fn().mockName('getArticle').mockImplementation(() => {
        return {}
    }),
    defaultQuery: jest.fn().mockImplementation(() => {
        return mockDefaultQuery
    })
}))

嗯,在实现了这个模式之后,我仍然有类似的行为。我所注意到的解决问题的方法是将我所模拟的内容从常量转换为函数。我不确定我引用const的方式的本质是否阻止了mock调用它的实现(即defaultQuery vs defaultQuery()),但这是目前我可以接受的解决方法!