1

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

这是该模块的简化版本:

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

4

1 回答 1

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')

于 2019-08-24T14:22:54.630 回答