#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 /… ). Это один из пунктов извлечения соавторов, таких как сервисы, для разделения, чтобы упростить тестирование .