Как сделать объект окна Bootstrapper доступным для модульного тестирования? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть функция в моем проекте, которая вызывает функцию из объекта начальной загрузки окна. Ниже приведена функция:

export default function measurement(analObj) {
    if (window.Bootsrapper._trackAnalytics === function) {
        window.Bootstrapper._trackAnalytics(analObj);
    }
}

Я написал ниже код для модульного тестирования этой функции в jest:

import measurement from "../helpers/measurement";

describe('Test measurement', () => {
  beforeAll(() => {
    const Bootstrapper = {
      _trackAnalytics: function(obj) {
        return obj;
      },
    };
    window.Bootstrapper = Bootstrapper;
  })
  test('should send analytics object to rtrack analyitics', () => {
    const testObj = {
      pageName: "Leave Abasence"
    }
    const result = measurement(testObj);
    expect(testObj).toEqual(result);
  })
})

Я получаю «неопределенное» для переменной результата, получаемой при вызове функции измерения, поскольку я не могу сделать функцию window.measurement._trackAnalytics доступной для функции measurement во время выполнения.

Я хотел бы знать:

  1. Правильный ли мой подход для модульного тестирования этого сценария? Если да, то как сделать функцию _trackAnalytics доступной для функции measurement во время выполнения модульного теста.

  2. Пожалуйста, предложите любой другой лучший подход, если вы знаете.

1 Ответ

0 голосов
/ 25 апреля 2020

Функция window.measurement._trackAnalytics действительно доступна для функции measurement при выполнении теста. В противном случае вы получите TypeError для вызова чего-то, что не является функцией.

Проблема в том, что в методе measurement ничего не возвращается. Метод _trackAnalytics вызывается, но его результат не возвращается. Вот почему вы получаете undefined как result.

Чтобы проверить, действительно ли он вызывается, я бы использовал функцию jest mock . Тест будет выглядеть так:

test('should send analytics object to rtrack analyitics', () => {
    const testObj = {
        pageName: 'Leave Abasence'
    };

    measurement(testObj);
    expect(window.Bootstrapper._trackAnalytics).toHaveBeenCalledTimes(1);
    expect(window.Bootstrapper._trackAnalytics).toHaveBeenCalledWith(testObj);
});


Обратите внимание, что в вашем коде есть некоторые проблемы (которые, как я ожидаю, являются опечатками). В состоянии if вы проверяете Bootsrapper вместо Bootstrapper. И вы проверяете, равно ли оно функции вместо проверки с помощью typeof. Я думаю, что строка должна выглядеть так:
if (typeof window.Bootstrapper._trackAnalytics === 'function') {
...