我需要測驗一個函式,我從一個名為“heartbeats”的 NPM 包中呼叫另一個函式:
索引.ts
export async function checkUp(app: App, heart, beats: number, iterations: number): Promise<void> {
// const heart = heartbeats.createHeart(1000, 'checkUp');
heart.createEvent(beats, { countTo: iterations }, async (count, last) => {
const secondCheck = await secondCheckStatus();
if (!secondCheck) {
app.quit();
}
});
}
index.test.ts
import * as Heartbeats from 'heartbeats';
import { secondCheckStatus } from './utils';
...
jest.mock('./utils', () => ({
...jest.requireActual('./utils'),
secondCheckStatus: jest.fn(),
}));
const mockSecondCheckStatus = secondCheckStatus as jest.MockedFunction< typeof secondCheckStatus >;
...
beforeEach(() => {
jest.clearAllMocks();
});
...
it('should auto kill app after checks', async () => {
const mockApp = new MockApp() as unknown as jest.Mocked<App>;
const mockHeart = Heartbeats.heart as unknown as jest.Mock;
const mockCreateEvent = Heartbeats.heart.createEvent as unknown as jest.MockedFunction<
typeof Heartbeats.heart.createEvent
>;
mockCreateEvent.mockImplementation((beats, iter, cb) => {
cb(null, null);
});
mockSecondCheckStatus.mockResolvedValueOnce(false);
mockApp.requestSingleInstanceLock.mockReturnValue(true);
const isRunning = await checkUp(mockApp, mockHeart, 1, 1);
await main(mockApp);
expect(mockApp.quit).toHaveBeenCalledTimes(1);
expect(isRunning).toBe(false);
});
但我總是得到:
型別錯誤:無法讀取未定義的屬性“mockImplementation”
83 | typeof Heartbeats.heart.createEvent
84 | >;
> 85 | mockCreateEvent.mockImplementation((beats, iter, cb) => {
知道我做錯了什么嗎?
非常感謝(我與 Jest 順利合作還有很長的路要走)
uj5u.com熱心網友回復:
由于checkUp函式接受app并heart作為其引數,您可以創建與這些引數型別或介面匹配的模擬物件。
只有secondCheckStatus函式被import關鍵字匯入,你必須使用jest.mock()方法來模擬它。
為了處理TS型問題的嘲笑物件/功能,你可以用嘲笑(專案:T,深= FALSE)的輔助功能ts-jest。
例如
index.ts:
import { secondCheckStatus } from './utils';
export async function checkUp(app, heart, beats: number, iterations: number): Promise<void> {
heart.createEvent(beats, { countTo: iterations }, async (count, last) => {
const secondCheck = await secondCheckStatus();
if (!secondCheck) {
app.quit();
}
});
}
util.ts:
export async function secondCheckStatus() {
return true;
}
index.test.ts:
import { checkUp } from './';
import { secondCheckStatus } from './utils';
import { mocked } from 'ts-jest/utils';
jest.mock('./utils', () => ({
...(jest.requireActual('./utils') as object),
secondCheckStatus: jest.fn(),
}));
const mockSecondCheckStatus = mocked(secondCheckStatus);
describe('69720608', () => {
beforeEach(() => {
jest.clearAllMocks();
});
test('should pass', async () => {
const mockApp = {
quit: jest.fn(),
};
const mockHeart = {
createEvent: jest.fn().mockImplementation(async (beats, options, callback) => {
await callback();
}),
};
await checkUp(mockApp, mockHeart, 1, 1);
expect(mockSecondCheckStatus).toBeCalledTimes(1);
expect(mockApp.quit).toBeCalledTimes(1);
});
});
測驗結果:
PASS examples/69720608/index.test.ts (13.424 s)
69720608
? should pass (4 ms)
----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------|---------|----------|---------|---------|-------------------
All files | 88.89 | 50 | 75 | 87.5 |
index.ts | 100 | 50 | 100 | 100 | 6
utils.ts | 50 | 100 | 0 | 50 | 2
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 15.478 s
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/337931.html
上一篇:用C計算檔案中的字母
