【问题标题】:Jest mock not returning expected value开玩笑模拟没有返回预期值
【发布时间】:2018-08-17 21:06:06
【问题描述】:

我发现我正在使用的一个返回字符串的模拟似乎返回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
    })
})
)

但是从导入的“函数”库调用 defaultQuery 在测试范围内返回 [Function mockConstructor],而不是它应该返回的 const 定义的“query { mock }”。

我也尝试过使用jest.fn().mockReturnValue(mockDefaultQuery),但无济于事。

【问题讨论】:

    标签: jestjs babel-jest


    【解决方案1】:

    问题是jest.mock 在编译过程中会被提升到你的测试文件的顶部,have a look here。因此,您永远不能在模拟定义内的模块范围内使用某些东西。所以你的代码是这样评估的

    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 转换为函数。不确定我指的是 const 的性质是否阻止了模拟调用它的实现(即 defaultQuery 与 defaultQuery()),但目前对我来说这是一个可以接受的工作!
    猜你喜欢
    • 2021-10-16
    • 2021-08-18
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 2019-11-19
    • 2019-10-27
    • 2018-11-13
    • 1970-01-01
    相关资源
    最近更新 更多