【问题标题】:Jest mocking a dependency that's instantiated before the module export嘲笑在模块导出之前实例化的依赖项
【发布时间】:2019-08-24 22:22:54
【问题描述】:

我正在尝试测试一个导出一个默认函数的文件,并且还实例化一个对象导出的函数之前,每次调用导出的函数时该对象都需要保持为同一个实例。

这是模块的简化版本:

import { HttpClient } from '../client'

const client = new HttpClient()

export default (params) => {
    const url = 'www.'
    // There's a little bit more code here to generate the url based on the params passed in
    return client.get(url)
}

我想测试发送给client.get()函数的url是否正确,所以测试如下:

import myModule from '../myModule'
import { HttpClient } from '../client'
jest.mock('../client')

const mockHttpClient = { get: jest.fn(() => 'test') }
HttpClient.mockImplementation(() => mockHttpClient)

it('should parse the query param string', () => {
    console.log(myModule({}))
})

测试运行时,来自myModule({}) 的响应始终未定义。

但是,如果我将 const client = new HttpClient() 行向下移动到导出函数的内部,它可以正常工作并且myModule({}) 返回test

我需要 HttpClient 只定义一次,并且每次调用函数时都使用相同的实例,所以它必须在函数外部实例化。如何模拟该对象创建以返回我的自定义值?谢谢。

【问题讨论】:

    标签: javascript typescript mocking jestjs ts-jest


    【解决方案1】:

    这是因为当你调用import {} from '../client' 时,它会在你模拟构造函数之前立即调用new HttpClient()。您可以将模拟更改为

    jest.mock('../client', () => ({
      HttpClient: jest.fn(() => ({
        get: jest.fn(() => 'test'),
      }));
    }));
    

    但通常任何涉及网络 IO 的事情都是异步的,因此您实际上可能需要返回类似 jest.fn(() => Promise.resolve('test'))jest.fn().mockResolvedValue('test') 的承诺

    【讨论】:

      猜你喜欢
      • 2016-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2019-08-08
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多