gpt4 book ai didi

javascript - 为什么在模拟 Node.js 模块时 Jest 模拟实例为空?

转载 作者:行者123 更新时间:2023-12-02 16:56:02 25 4
gpt4 key购买 nike

我在模拟方面遇到了一些问题,我通过添加 mocks/ssh2-sftp-client.ts 文件模拟了一个节点模块:

const mockSsh2SftpClient = jest.fn().mockImplementation(() => {
return {
connect: async () => {},
end: async () => {},
on: () => {}
}
})

export default mockSsh2SftpClient

这很管用。我的测试使用这个模拟正确运行,但在测试中 SftpClient.mock.instances[0] 是一个空的 mockConstructor {} 对象而不是这个模拟(即 SftpClient.mock.instances[0].end 是未定义的)。我究竟做错了什么?作为引用,我的测试代码如下所示:

import { ConnectConfig } from 'ssh2'
import SftpClient from 'ssh2-sftp-client'
import { withSftp } from '../sftp'

// Type assertion to make TypeScript happy.
const MockSftpClient = SftpClient as jest.Mock<SftpClient>

describe(withSftp, () => {
const mockConnectionConfig: ConnectConfig = {}

beforeEach(() => {
// Clear all instances and calls to constructor and all methods:
MockSftpClient.mockClear()
})

it('should call the callback after successfully connecting', async () => {
const mockCallback = jest.fn()

// Instantiates SftpClient and calls connect, then the callback, then end.
await withSftp(mockConnectionConfig, mockCallback)

const mockInstance = MockSftpClient.mock.instances

expect(mockCallback).toHaveBeenCalledTimes(1)
expect(MockSftpClient.mock.instances[0].end).toHaveBeenCalledTimes(1)
})
})

最后一个失败是因为 MockSftpClient.mock.instances[0].end 是未定义的,它应该是一个函数。

最佳答案

Jest 提供的模拟构造函数 only records this as the instance因此,如果您的模拟构造函数返回一个不同的对象,那么该对象将不会记录在 instances 数组中。

要获得您想要的行为,只需使用标准函数模拟并使用 this:

__mocks__/ssh2-sftp-client.ts

const mockSsh2SftpClient = jest.fn(function() {
this.connect = jest.fn();
this.end = jest.fn();
this.on = jest.fn();
});

export default mockSsh2SftpClient

关于javascript - 为什么在模拟 Node.js 模块时 Jest 模拟实例为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56400704/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com