Имитация статических функций, вызываемых в тестируемой основной функции

Я хочу издеваться над некоторыми функциями внутри функции, которую я тестирую.

У меня есть класс, в котором есть несколько статических приватных функций, вызываемых из так называемого 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.


248
1

Ответ:

Решено

Ключевые слова 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