Модульное тестирование функции с условным оператором - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть функция для отслеживания аналитики от Google Analytics. Так что в моей функции мне нужно посмотреть, существует код или нет.

Analytics.js

const gaCode = process.env.REACT_APP_GA_TRACKING_CODE;
const gaCodeExists = gaCode && gaCode.Length > 0;

function trackEvent(category = "Event", name) {
    if(gaCodeExists) {
        GoogleAnalytics.event({
            category,
            action: name,
        });
    }

    return;
}

export default {
    gaCodeExists,
    trackEvent
}

Сначала я делал это (что, я уверен, я делаю неправильно).

describe('Testing analytics', () => {
    beforeEach(() => {
        Analytics.trackEvent(null, 'Tracking');
    });

    it('should not call google analytics', () => {
        if (!gaCodeExists) {
            const mockGoogleAnalytics = jest.fn(() => GoogleAnalytics.event);
            expect(mockGoogleAnalytics.mock.calls.length).toBe(0);
        }
    });
})

После прочтения некоторых постов в блоге и просмотра вопросов о стеке . Я изменил это, чтобы это, как я думаю, я издеваюсь над переменной gaCodeExists, как показано ниже.

import constants from '../index';
import { isUsingGoogleAnalytics } from '../index';

describe('Analytics Testing', () => {
    it('Should test trackEvent', () => {
        constants.isUsingGoogleAnalytics = true;
        expect(constants.isUsingGoogleAnalytics).toBe(true);
    });
});

Теперь я застрял, как я могу выполнить тестирование на функции trackEvent. Как я могу применить переменную макет gaCodeExists к нему? Тестовые случаи были бы, если gaCodeExists истинно, expect(mockFunction).toHaveBeenCalled(1).

П.С .: Я новичок в тестировании.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018
const gaCode = process.env.REACT_APP_GA_TRACKING_CODE;
const gaCodeExists = gaCode && gaCode.Length > 0;

function trackEvent(category = "Event", name, gaCodeExists) {
    if(gaCodeExists) {
        GoogleAnalytics.event({
            category,
            action: name,
        })
    }
}

export default {
    gaCodeExists,
    trackEvent
}

Сначала измените свой код Google Analytics следующим образом, ваш тестовый файл должен выглядеть следующим образом

import { UsingGoogleAnalytics } from '../index'  // i don't know what this file is
import { gaCodeExistsis, trackEvent } from './Analytics'

describe('Analytics Testing', () => {

    beforeEach(() => {
       expect(gaCodeExists).toHaveBeenCalledWith(true)
       expect(trackEvent).toEqual(jasmine.any(Function))
    })

    it('track event was called without params', () => { 
        expect(trackEvent()).toBe(1); // replace 1 with desire output without params
    })

    it('track event was called with params', () => { 
        expect(trackEvent("somecategory", "somename", gaCodeExistsis)).toBe(1); // replace 1 with desire output with params
    })
});
0 голосов
/ 02 ноября 2018

Ваш gaCodeExists присваивает значение переменной, пока загружается файл js. И функция trackEvent не является чистой, поскольку зависит от значения, выходящего за рамки ее действия. Желательно, чтобы ваши функции были чистыми, чтобы вы могли проверить их правильно. Поскольку это реализация GA, вы можете просто преобразовать gaCodeExists в функцию и смоделировать ее в своих тестах.

Измените gaCodeExists на метод

const gaCodeExists = () => {
  if(process && process.env && process.env.REACT_APP_GA_TRACKING_CODE) {
    const gaCode = process.env.REACT_APP_GA_TRACKING_CODE;
    return gaCode && gaCode.Length > 0;
  }
  return false;
}

Измените вашу trackEvent функцию на

function trackEvent(category = "Event", name) => {
  if(gaCodeExists()) { // note this line
    GoogleAnalytics.event({
      category,
      action: name,
    });
  }
  return;
}

Теперь вы можете проверить это, поэкспериментировав gaCodeExists function

import * as analytics from "../index";

describe('Testing analytics', () => {
  beforeEach(() => {
    const gaMock = jest.spyOn(analytics, "gaCodeExists");
  });

  it('should not call google analytics', () => {
    gaMock.mockImplementation(() => false);
    // check what happens when it doesn't call GA
  });

  it('should call google analytics', () => {
    gaMock.mockImplementation(() => true);
    // check what happens when it calls GA
  });

})

Я не проверял этот код. Поэтому, пожалуйста, проверьте, выполняет ли он то, для чего предназначен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...