开玩笑嘲笑在模块导出之前实例化的依赖项

时间:2019-08-23 13:08:57

标签: javascript typescript mocking jestjs ts-jest

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

这是该模块的简化版本:

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,并且每次调用函数时都使用相同的实例,因此必须在函数外部实例化它。如何模拟对象创建以返回我的自定义值?谢谢。

1 个答案:

答案 0 :(得分:0)

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

new HttpClient()

但是通常所有涉及网络IO的东西都是异步的,因此您实际上可能需要返回一个jest.mock('../client', () => ({ HttpClient: jest.fn(() => ({ get: jest.fn(() => 'test'), })); })); jest.fn(() => Promise.resolve('test'))之类的诺言