我正在尝试测试一个文件,该文件导出一个默认函数,并且还实例化对象之前,该对象每次调用导出函数时都需要保持相同的实例。< / 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,并且每次调用函数时都使用相同的实例,因此必须在函数外部实例化它。如何模拟对象创建以返回我的自定义值?谢谢。
答案 0 :(得分:0)
这是因为,当您调用log4j
时,它将在模拟构造函数之前立即调用import {} from '../client'
。您可以将模拟更改为
new HttpClient()
但是通常所有涉及网络IO的东西都是异步的,因此您实际上可能需要返回一个jest.mock('../client', () => ({
HttpClient: jest.fn(() => ({
get: jest.fn(() => 'test'),
}));
}));
或jest.fn(() => Promise.resolve('test'))
之类的诺言