Cod*_*Cat 4 mocking typescript jestjs
假设我有一个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
}
Run Code Online (Sandbox Code Playgroud)
这是数据库的模拟(__mocks__/Database.ts)
const mockConnection = {
query: jest.fn()
}
export const connect = jest.fn(
() => Promise.resolve(mockConnection)
)
export function __getMockConnection() {
return mockConnection
}
Run Code Online (Sandbox Code Playgroud)
您会看到我公开了一个,__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')
})
Run Code Online (Sandbox Code Playgroud)
测试用例确实按预期通过,但是出现此TypeScript错误
Module '"/project/path/Database"' has no exported member '__getMockConnection'. [2305]
Run Code Online (Sandbox Code Playgroud)
TypeScript不知道我Database要从模拟中导入。也是出于这个原因,我必须禁用ts-jest的诊断程序,该程序抱怨同样的问题。
我该如何解决?将导入路径更改为'../__mocks__/Database'不起作用。
这是仓库:https : //github.com/CodinCat/ts-jest-mock-issue
__tests__/index.spec.ts使用支持TypeScript的编辑器(如VS Code)打开,您将看到错误。
由于typescript不了解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");
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1416 次 |
| 最近记录: |