модульный тест для статической глобальной переменной, а именно. _paq

#angular #unit-testing #karma-jasmine #matomo

#angular #модульное тестирование #карма-жасмин #matomo

Вопрос:

Я использую matomo (ранее piwik) для аналитики моего веб-сайта с моим приложением angular7.

Согласно документации, я вставляю код отслеживания в свой index.html файл моего заявления. Содержимое выглядит следующим образом:

 <script type="text/javascript">
var _paq = window._paq = window._paq || [];
/* tracker methods like "setCustomDimension" should be called before "trackPageView" */
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
  var u="//example.com/";
  _paq.push(['setTrackerUrl', u 'matomo.php']);
  _paq.push(['setSiteId', '43']);
  var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0];
  g.type='text/javascript'; g.async=true; g.src=u 'matomo.js'; s.parentNode.insertBefore(g,s);
})();
  

Итак, это помогает загружать matomo.js статический файл из example.com/matomo.js url-адрес. Это предоставляет глобальную переменную _paq.

Теперь я хочу использовать эту глобальную переменную в моем файле matomo.service.ts для отслеживания событий. Поскольку _paq не является переменной angular, я явно объявляю ее в файле matomo.service.ts примерно так:

 declare let _paq: any[][];
  

Теперь я могу создавать различные методы в этом сервисном файле для отправки данных аналитики на сервер.

matomo.service.ts

 ...
declare let _paq: any[][];
...

trackEvents(category,action, label) {
  _paq.push(['trackEvent', category,action, label];
}
  

Это хорошо работает с любым компонентом, например

app.component.ts

 constructor(private matomoService: MatomoService) {}
trackEvent(category, action, label) {
    this.matomoService.trackEvents(category, action, label);
}
  

До сих пор все работает очень хорошо. Но когда я пытаюсь запустить модульный тест, он завершает работу со всеми компонентами, которые вызывают этот метод (this.matomoService.trackEvents(…) с ошибкой:

Ошибка ссылки: _paq не определен

Я пробовал разные методы, предложенные в других подобных вопросах, но ни один из них не работает.

Может кто-нибудь, пожалуйста, помочь мне здесь.

Комментарии:

1.Используете ли вы фактическое MatomoService значение в своих модульных тестах? Почему бы не заменить его тестовым двойным? declare let _paq: any[][]; это просто объявление типа, в котором говорится: «это определенно будет существовать во время выполнения», оно ничего не делает, чтобы это действительно произошло.

2. Спасибо за предложение. Я могу создать фиктивный сервис, но проблема в том, что тогда мне нужно создать этот фиктивный matomoService во всех компонентах, которых я хочу избежать. cc @jonrsharpe

3. Вы можете извлечь это в общий файл, если хотите, но это должно быть что-то вроде createSpyObj('MatomoService', ['trackEvents']) (см. <a rel="nofollow noreferrer noopener" href="https://jasmine.github.io/2.5/introduction#section-Spies:_createSpyObj» rel=»nofollow noreferrer»> jasmine.github.io/2.5 /… ). Это один из пунктов извлечения соавторов, таких как сервисы, для разделения, чтобы упростить тестирование .