Я пишу тестовый пример Jasmine / Karma, в котором, если пользователь наводит указатель мыши на элемент с текстом всплывающей подсказки, появляется всплывающая подсказка, но я, кажется, застрял.
Предположим, чтоУ меня есть этот элемент HTML с функциональностью для всплывающей подсказки, которая появляется при наведении на нее курсора благодаря Bootstrap:
<span id="testToolTipSpan" data-toggle="tooltip" data-placement="left" ngbTooltip="Test tooltip">Tooltip Span</span>
Этот диапазон находится в файле HTML компонента Angular.
Когда яНаведите указатель мыши на промежуток, слева от него появится «Подсказка для теста» в виде всплывающей подсказки.
Это то, что Bootstrap генерирует и помещает в DOM по умолчанию:
<div class="tooltip show bs-tooltip-left" role="tooltip">
<div class="arrow"></div>
<div class="tooltip-inner">
Test tooltip
</div>
</div>
По какой-то причине, если у меня, например, этот тестовый пример написан с использованием Jasmine:
/*
Assume the following:
- Angular component is called testPage declared as ComponentFixture<TestPageComponent>.
- rootElementOfComponent is assigned testPage.nativeElement.
- rootDebugElementOfComponent is assigned testPage.debugElement
*/
it ('should show \"Test tooltip\" on hovering over the tooltip span ', () => {
// Fire a mouse hover event.
rootDebugElementOfComponent.query(By.css('#testToolTipSpan')).nativeElement.dispatchEvent(new MouseEvent('mouseover'));
// Check for the hover event.
testPage.detectChanges();
testPage.whenStable().then(() => {
// Pick up the tooltip element that's displayed on the page.
testPage.detectChanges();
// Check if the tool tip is defined and has the required event.
expect(rootElementOfComponent.querySelector('.tooltip.show.bs-tooltip-left')).toBeDefined();
expect(rootElementOfComponent.querySelector('.tooltip.show.bs-tooltip-left').innerText).toBe('Test tooltip');
expect(rootDebugElementOfComponent.query(By.css('.tooltip.show.bs-tooltip-left')).nativeElement.innerText).toBe('Test tooltip');
});
});
при запуске тестового примера, я получаю эту ошибку в консоли в Chrome:
context.js:1972 Unhandled Promise rejection: Cannot read property 'innerText' of null ; Zone: ProxyZone ; Task: Promise.then ; Value: TypeError: Cannot read property 'innerText' of null
at :9876/_karma_webpack_/webpack:/src/app/<anonymous directory>
at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:388)
at ProxyZoneSpec.webpackJsonp../node_modules/zone.js/dist/zone-testing.js.ProxyZoneSpec.onInvoke (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:239)
at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:387)
at Zone.webpackJsonp../node_modules/zone.js/dist/zone.js.Zone.run (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:138)
at :9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:858
at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:421)
at ProxyZoneSpec.webpackJsonp../node_modules/zone.js/dist/zone-testing.js.ProxyZoneSpec.onInvokeTask (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:263)
at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:420)
at Zone.webpackJsonp../node_modules/zone.js/dist/zone.js.Zone.runTask (:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:188) TypeError: Cannot read property 'innerText' of null
at http://localhost:9876/_karma_webpack_/webpack:/src/app/<anonymous directory>
at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:388:1)
at ProxyZoneSpec.webpackJsonp../node_modules/zone.js/dist/zone-testing.js.ProxyZoneSpec.onInvoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:239:1)
at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invoke (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:387:1)
at Zone.webpackJsonp../node_modules/zone.js/dist/zone.js.Zone.run (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:138:1)
at http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:858:1
at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:421:1)
at ProxyZoneSpec.webpackJsonp../node_modules/zone.js/dist/zone-testing.js.ProxyZoneSpec.onInvokeTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone-testing.js:263:1)
at ZoneDelegate.webpackJsonp../node_modules/zone.js/dist/zone.js.ZoneDelegate.invokeTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:420:1)
at Zone.webpackJsonp../node_modules/zone.js/dist/zone.js.Zone.runTask (http://localhost:9876/_karma_webpack_/webpack:/node_modules/zone.js/dist/zone.js:188:1)
По сути, rootElementOfComponent.querySelector ('. Tooltip.show.bs-tooltip-left') и rootDebugElementOfComponent.query (By.css ('. Tooltip.show.bs-tooltip-left'))возвращая ноль.
Если я вместо этого вызываю rootElementOfComponent.querySelector ('# testToolTipSpan'), он возвращает сам исходный элемент span.
Я прочитал несколько вопросов StackOverflow и провел исследование сам, но не нашел ничего о выбореЭлемент подсказки начальной загрузки, который появляется только тогда, когда пользователь наводит курсор на элемент, который вызывает всплывающую подсказку.Один источник предполагает, что мой набор тестов не связан с документом, но из моих экспериментов я не думаю, что это является причиной проблемы.Другой источник был связан с элементами, состоящими из двух или более классов, и с тем, как их выбирать, где в аргументе для querySelector не должно быть пробелов;вместо этого между именами классов должен быть период.