Я хочу издеваться над некоторыми функциями внутри функции, которую я тестирую.
У меня есть класс, в котором есть несколько статических приватных функций, вызываемых из так называемого mainFunction
. Я хочу особенно проверить результат MyClass.functionD
(вызванный mainFunction
, который является частным методом), поэтому я хотел бы смоделировать MyClass.functionA
, MyClass.functionB
и MyClass.functionC
, чтобы вернуть результат по умолчанию, чтобы мой тест мог сосредоточиться на результате MyClass.fucntionD
.
export default class MyClass {
static mainFunction(paramA: string, paramB: number): boolean {
if (MyClass.functionA(paramA, paramB)) {
return false;
}
if (!MyClass.functionB(paramA, paramB)) {
return false;
}
if (MyClass.functionC(paramA, paramB)) {
return false;
}
// I need to focus on the result of this function (i.e. private) for my test
if (MyClass.functionD(paramA)) {
return false;
}
return true;
}
}
До сих пор я пробовал шутить spyOn
и некоторые функции имитации по умолчанию, но я просто потерялся и не могу продолжить, так как я действительно новичок в машинописном тексте / Javascript. Любого намека/ссылки, связанной с тем, как мне действовать, было бы достаточно для меня. :) Спасибо.
🤔 А знаете ли вы, что...
С JavaScript можно создавать расширения для различных платформ, таких как Adobe Acrobat и Microsoft Office.
Ключевые слова TypeScript public/private применяются только к тому, как TypeScript проверяет ваш код — они не влияют на вывод JavaScript. Таким образом, вы можете получить доступ к этим закрытым методам через нотацию скобок , например MyClass['fucntionA']
, которая будет игнорировать проверку типа TSC. Затем вы можете использовать jest.spyOn
, чтобы издеваться над этими приватными методами.
Вот моя тестовая стратегия для вашего случая:
MyClass.ts
:
export default class MyClass {
static mainFunction(paramA: string, paramB: number): boolean {
if (MyClass.fucntionA(paramA, paramB)) {
return false;
}
if (!MyClass.fucntionB(paramA, paramB)) {
return false;
}
if (MyClass.fucntionC(paramA, paramB)) {
return false;
}
if (MyClass.fucntionD(paramA)) {
return false;
}
return true;
}
private static fucntionA(a, b) {
return true;
}
private static fucntionB(a, b) {
return false;
}
private static fucntionC(a, b) {
return true;
}
private static fucntionD(a) {
return false;
}
}
MyClass.test.ts
:
import MyClass from './MyClass';
describe('65376946', () => {
afterEach(() => {
jest.restoreAllMocks();
});
it('should pass', () => {
const fucntionASpy = jest.spyOn(MyClass as any, 'fucntionA').mockReturnValueOnce(false);
const fucntionBSpy = jest.spyOn(MyClass as any, 'fucntionB').mockReturnValueOnce(true);
const fucntionCSpy = jest.spyOn(MyClass as any, 'fucntionC').mockReturnValueOnce(false);
const fucntionDSpy = jest.spyOn(MyClass as any, 'fucntionD').mockReturnValueOnce(true);
const actual = MyClass.mainFunction('a', 1);
expect(actual).toBeFalsy();
expect(fucntionASpy).toBeCalledWith('a', 1);
expect(fucntionBSpy).toBeCalledWith('a', 1);
expect(fucntionCSpy).toBeCalledWith('a', 1);
expect(fucntionDSpy).toBeCalledWith('a');
});
});
результат модульного теста:
PASS examples/65376946/MyClass.test.ts
65376946
✓ should pass (3 ms)
------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
------------|---------|----------|---------|---------|-------------------
All files | 42.86 | 50 | 20 | 42.86 |
MyClass.ts | 42.86 | 50 | 20 | 42.86 | 4,8,12,19-34
------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 4.168 s