Почему экземпляр Jest mock пуст при использовании модуля Node.js? - PullRequest
0 голосов
/ 31 мая 2019

У меня возникли некоторые проблемы с mocking, я смоделировал модуль узла, добавив 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 не определен, где он должен быть функцией.

1 Ответ

0 голосов
/ 04 июня 2019

Конструктор макетов, предоставленный Jest , записывает только this в качестве экземпляра , поэтому, если ваш конструктор макетов возвращает другой объект, этот объект не будет записан в массиве 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...