Импорт файла-заглушки в модульном тестировании Angular 2+

В моем проекте много служебных функций, которые выполняют некоторые преобразования данных и т. д. Эти функции не относятся к классу и повторно используются во многих служебных файлах.

Я очень новичок в угловом тестировании. Искал довольно долго, и я не мог найти способ заглушить импорт проверенного файла. Вот пример:

/utils/helpers.ts

export const sumNumber = (a: number, b: number): number => {
  return a + b;
}

/utils/file-i-want-to-test.ts

import { sumNumber } from "./helpers";

export const sumArrays = (arr1: number[], arr2: number[]): number[] => {
  const len = arr1.length > arr2.length ? arr1.length : arr2.length;
  const result = new Array(len).fill(0);

  return result.map((_, index) => sumNumber(arr1[index] || 0, arr2[index] || 0));
}

/utils/file-i-want-to-test.spec.ts

import { sumArrays } from './file-i-want-to-test';

describe('Utilities', () => {

  describe('Function - sumArrays', () => {

    it('should return empty array', () => {
      const actual = sumArrays([], []);
      expect(actual).toEqual([]);
    });

    it('should call sumValue 2 times', () => {
      const actual = sumArrays([1, 2], [3, 4]);

      // How to test that sumArray is actually calling his dependency sumNumber?
    });
  });
});

Проблема

Чтобы правильно выполнить модульное тестирование функции sumArrays, мне нужно заглушить ее зависимость sumNumber. Как это можно сделать?


person Vladyslav    schedule 06.10.2020    source источник


Ответы (1)


Попробуй это:

import * as helpers from './helpers'; // import helpers like so

describe('Utilities', () => {

  describe('Function - sumArrays', () => {

    it('should return empty array', () => {
      const actual = sumArrays([], []);
      expect(actual).toEqual([]);
    });

    it('should call sumValue 2 times', () => {
      spyOn(helpers, 'sumNumber'); // this just stubs it to return undefined
      const actual = sumArrays([1, 2], [3, 4]);
      expect(helpers.sumNumber).toHaveBeenCalled(); // expect it was called
      // How to test that sumArray is actually calling his dependency sumNumber?
    });
  });
});

spyOn также имеет более богатый API, spyOn просто возвращает значение undefined.

spyOn(helpers, 'sumNumber').and.callFake(/* your fake function here */); // можно вызвать подделку, поэтому каждый раз, когда вызывается sumNumber, у вас может быть собственное определение функции

spyOn(helpers, 'sumNumber').and.returnValue(2) // всегда возвращаем 2 при вызове sumNumbers

// также можно увидеть, сколько раз он вызывался expect(helpers.sumNumber).toHaveBeenCalledTimes(2); // вызывался два раза // может видеть, с чем он был вызван с expect(helpers.sumNumber).toHaveBeenCalledWith([1, 2]); // 1 означает a, 2 означает b

person AliF50    schedule 06.10.2020
comment
Привет. Спасибо за подробное объяснение. К сожалению, это не сработало так, как вы указали: Error: <spyOn> : sumNumber is not declared writable or has no setter Usage: spyOn(<object>, <methodName>) Я нашел ответ, который сработал для меня, в другом потоке: ссылка В любом случае спасибо - person Vladyslav; 08.10.2020