如何解决如何验证在打字稿单元测试中调用了node-fetch?
嗨,我有一个导出一些方法的模块,我想用一些单元测试来测试它们。我的项目基于打字稿^ 3.9.7,并安装了jest ^ 26.1.0和ts-jest ^ 26.2.0
其中一种方法可以导入node-fetch ^ 2.6.0,以便能够在节点环境中使用window.fetch。
import fetch from 'node-fetch'
export const fetchResponseFromRemoteFile = (
remoteFileUrl: string
): Promise<Response> =>
fetch(remoteFileUrl)
.then(res => {
return res.status === 200
? res
: new Error(`failed to retrieve ${remoteFileUrl}`)
})
.catch(e => e)
在我的一项测试中,我想检查 fetchResponseFromRemoteFile 是否调用 fetch
方法1
import { mocked } from 'ts-jest/utils'
import fetch from 'node-fetch'
jest.mock('node-fetch')
it('fetches',async () => {
const expectedResponse = { a: 1 }
mocked(fetch).mockImplementation( () => <any>expectedResponse)
...
})
// mocked(fetch).mockImplementation( () => <any>expectedResponse)
TypeError: (0,_utils2.mocked)(...).mockImplementation is not a function
方法2
it('fetches',async () => {
const expectedResponse = { a: 1 }
;(fetch as jest.Mock).mockReturnValue(Promise.resolve(new Response(expectedResponse)))
const remoteFile = await utils.fetchResponseFromRemoteFile(mockUrl)
expect(fetch).toHaveBeenCalledTimes(1)
expect(remoteFile.status).toEqual(200);
expect(remoteFile.body).toEqual(expectedResponse);
...
})
// ;(fetch as jest.Mock).mockReturnValue(Promise.resolve(new Response(expectedResponse)))
ReferenceError: Response is not defined
方法3
import fetch from 'node-fetch'
jest.mock('node-fetch',() => jest.fn())
it('fetches',async () => {
const expectedResponse = { body: { a: 1 } }
const response = Promise.resolve(expectedResponse)
fetch.mockImplementation(()=> response)
...
})
// fetch.mockImplementation(()=> response)
TypeError: _nodeFetch.default.mockImplementation is not a function
关于这里发生的事情的想法? 预先感谢
解决方法
要对此进行正确的单元测试,应使用依赖项注入:
export class FetchService {
constructor(private readonly fetchInstance: any) {}
public fetchResponseFromRemoteFile(
remoteFileUrl: string
): Promise < Response > {
this.fetchInstance(remoteFileUrl)
.then(res => {
return res.status === 200
? res
: new Error(`failed to retrieve ${remoteFileUrl}`)
})
.catch(e => e);
}
}
这样,您可以实例化一个模拟并将其传递给您的服务,同时进行如下测试:
const fetchMock = jest.Mock(); // Don't know the exact code but you know what I mean
const fetchService = new FetchService(fetchMock);
// Now you can do assertions on the 'fetchMock'.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。