1
這裏的功能是我moduleA.ts
:玩笑,戲弄不工作
我想嘲笑genName
功能和測試getMessage
功能
const getMessage =(): string => {
return `Her name is ${genName()}`;
};
function genName(): string {
return Math.random() > 0.5 ? 'emilie' : 'novaline';
}
export default {
getMessage,
genName
}
這裏是我的測試文件:
import moduleA from '../moduleA';
moduleA.genName = jest.fn(() => 'mrdulin');
describe('mock function',() => {
it('t-0',() => {
expect(jest.isMockFunction(moduleA.genName)).toBeTruthy();
expect(moduleA.genName()).toBe('mrdulin');
});
it('t-0.5',() => {
expect(jest.isMockFunction(moduleA.genName)).toBeTruthy();
});
it('t-1',() => {
expect(moduleA.getMessage()).toBe('Her name is emilie');
expect(moduleA.genName).toHaveBeenCalled()
});
});
但它似乎不是模擬genName
功能成功:
FAIL jest-examples/__test__/mock-function-0.spec.ts
● mock function › t-1
expect(received).toBe(expected)
Expected value to be (using ===):
"Her name is emilie"
Received:
"Her name is novaline"
at Object.it (jest-examples/__test__/mock-function-0.spec.ts:18:34)
at Promise.resolve.then.el (node_modules/p-map/index.js:42:16)
at process._tickCallback (internal/process/next_tick.js:109:7)
mock function
✓ t-0 (3ms)
✓ t-0.5
✕ t-1 (14ms)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 2 passed, 3 total
Snapshots: 0 total
Time: 0.152s, estimated 1s
Ran all test suites related to changed files.
但我確定已調用moduleA.genName
函數。
PASS jest-examples/__test__/mock-function-0.spec.ts
mock function
✓ t-0 (2ms)
✓ t-0.5 (1ms)
✓ t-1 (1ms)
Test Suites: 1 passed, 1 total
Tests: 3 passed, 3 total
Snapshots: 0 total
Time: 0.148s, estimated 1s
Ran all test suites related to changed files.
合理的問題表示,但讓我們假設一個通用的解決方案可能從長遠來看更有用。 –
好吧然後答案是,你應該只嘲笑外部依賴,你不應該模擬你想測試的模塊的一部分。 –
我不得不不同意 - 如果一個模塊使用公開暴露的內部函數,我不明白這個問題是什麼 - 這就是單元測試的重點:測試孤立的功能。方法使用的「外部」功能在同一模塊中似乎與我無關。你能幫我理解嗎? –