TypeScript не распознает мой модуль шутки - PullRequest
0 голосов
/ 07 ноября 2018

Предположим, у меня есть index.ts, который будет импортировать Database.ts и выполнить несколько запросов. Чтобы проверить этот index.ts файл, я хочу высмеять Database.ts, потому что я не хочу подключаться к какой-либо реальной базе данных.

Это мой index.ts:

import { connect } from './Database'

export async function runSomeQuery() {
  const connection = await connect()
  const result = await connection.query('SOME QUERY')
  return result
}

а вот макет базы данных (__mocks__/Database.ts)

const mockConnection = {
  query: jest.fn()
}

export const connect = jest.fn(
  () => Promise.resolve(mockConnection)
)

export function __getMockConnection() {
  return mockConnection
}

вы можете видеть, что я выставляю __getMockConnection, чтобы я мог получить mockConnection в моих тестах (index.spec.ts) (этот шаблон взят из официального документа ):

import { connect, __getMockConnection } from '../Database'
//                ^^^^ getting type error here 
import { runSomeQuery } from '../index'

jest.mock('../Database')

test('runSomeQuery', async () => {
  await runSomeQuery()
  const mockConnection = __getMockConnection()
  expect(connect).toBeCalled()
  expect(mockConnection.query).toBeCalledWith('SOME QUERY')
  expect(mockConnection.query).toBeCalledWith('SOME QUERY')
})

Тестовый пример проходит, как и ожидалось, но я получаю эту ошибку TypeScript

Module '"/project/path/Database"' has no exported member '__getMockConnection'. [2305]

TypeScript не знает, что я импортирую Database из макета. Также по этой причине я должен отключить диагностику ts-jest, которая жалуется на ту же проблему.

Как я могу решить это? Изменить путь импорта на '../__mocks__/Database' не работает.

Вот репо: https://github.com/CodinCat/ts-jest-mock-issue

Откройте __tests__/index.spec.ts с помощью редактора, который поддерживает TypeScript, такой как VS Code, и вы увидите ошибку.

1 Ответ

0 голосов
/ 09 ноября 2018

Поскольку машинопись не знает о jest насмешках, вам нужно будет вручную вводить приведение, когда ваши насмешки отличаются от вашего фактического кода:

import * as MockDatabase from "../__mocks__/Database";
import * as Database from "../Database";

import { runSomeQuery } from "../index";
jest.mock("../Database");

// Type cast since Database is automatically mocked by jest
const { connect, __getMockConnection } = Database as typeof MockDatabase;

test("runSomeQuery", async () => {
  await runSomeQuery();
  const mockConnection = __getMockConnection();
  expect(connect).toBeCalled();
  expect(mockConnection.query).toBeCalledWith("SOME QUERY");
});
...