Javascript 开玩笑地嘲笑一个';在模块导出之前实例化
我试图测试一个导出一个默认函数的文件,并在导出函数之前实例化一个对象,该对象需要在每次调用导出函数时保持为同一实例 以下是该模块的简化版本:Javascript 开玩笑地嘲笑一个';在模块导出之前实例化,javascript,typescript,mocking,jestjs,ts-jest,Javascript,Typescript,Mocking,Jestjs,Ts Jest,我试图测试一个导出一个默认函数的文件,并在导出函数之前实例化一个对象,该对象需要在每次调用导出函数时保持为同一实例 以下是该模块的简化版本: import { HttpClient } from '../client' const client = new HttpClient() export default (params) => { const url = 'www.' // There's a little bit more code here to gener
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,并且每次调用函数时都使用相同的实例,因此它必须在函数外部实例化。如何模拟对象创建以返回自定义值?谢谢。这是因为当您从“../client”调用
import{}时,它将在模拟构造函数之前立即调用new HttpClient()
。你可以把你的模拟改成
jest.mock('../client', () => ({
HttpClient: jest.fn(() => ({
get: jest.fn(() => 'test'),
}));
}));
但通常涉及网络IO的任何内容都是异步的,因此实际上可能需要返回一个承诺,如jest.fn(()=>promise.resolve('test'))
或jest.fn().mockResolvedValue('test')