打字稿无法识别我的笑话模拟模块



假设我有一个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不知道我正在从mock导入Database。同样由于这个原因,我不得不禁用ts jest的诊断程序,它会抱怨同样的问题。

我该如何解决这个问题?将导入路径更改为'../__mocks__/Database'无效。

以下是回购:https://github.com/CodinCat/ts-jest-mock-issue

使用支持类似VS Code的TypeScript的编辑器打开__tests__/index.spec.ts,您会看到错误。

由于typescript不知道jestmocking,因此每当mock与实际代码不同时,都需要手动键入cast:

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");
});

2022年9月29日更新:

mocked函数已集成到jest中,在ts jest中不再可用。


原始答案:

另一种选择是使用ts-jest的mocked((助手。助手将确保您可以访问模拟测试方法。有关详细信息,请查看此处的帖子:使用Typescript 从Jest手动模拟导入函数

最新更新