2017-02-15 15 views
6

Я использую всплывающие подсказки и модалы во вложенном компоненте, а в моем файле spec я импортирую NgbModule.forRoot() в модуль тестирования.Использование NgbModule.forRoot() в компоненте, вызывающем тесты с ошибкой

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

TypeError: this._unregisterListenersFn is not a function 
     at NgbTooltip.ngOnDestroy 

Я использую Угловое CLI для пакетирования/тестирование.

Это единственный компонент, который не прошел тесты.

Я также попытался импортировать модули Tooltip/Modal отдельно и их соответствующие поставщики отдельно, и я продолжаю получать ошибку выше. Если я попробую без forRoot(), я получаю ошибки DI.

Я понятия не имею, в чем проблема.

Вот файл спецификации:

/* tslint:disable:no-unused-variable */ 
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 
import { By } from '@angular/platform-browser'; 
import { DebugElement } from '@angular/core'; 
import { APP_BASE_HREF } from '@angular/common'; 
import { RouterTestingModule } from '@angular/router/testing'; 
import { NgbModule, NgbTooltipModule, NgbTooltipConfig, NgbModalModule } from '@ng-bootstrap/ng-bootstrap'; 
import { NgbModalStack } from '@ng-bootstrap/ng-bootstrap/modal/modal-stack'; 

import { ListItemComponent } from './list-item.component'; 
import { VideoPlayerService } from '../../../video-player'; 
import { CalendarRoutingService } from '../../calendar-routing.service'; 

describe('ListItemComponent',() => { 
    let component: ListItemComponent; 
    let fixture: ComponentFixture<ListItemComponent>; 

    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     declarations: [ 
     ListItemComponent 
     ], 
     imports: [RouterTestingModule, NgbModule.forRoot()], 
     providers: [ 
     VideoPlayerService, 
     CalendarRoutingService, 
     // NgbModalStack, 
     // NgbTooltipConfig 
     ] 
    }) 
    .compileComponents(); 
    })); 

    beforeEach(() => { 
    fixture = TestBed.createComponent(ListItemComponent); 
    component = fixture.componentInstance; 
    component.item = { records: [] }; 
    fixture.detectChanges(); 
    }); 

    it('should create',() => { 
    expect(component).toBeTruthy(); 
    }); 
}); 

ответ

1

У меня есть обходной путь, но я думаю, что это проблема с NgbTooltip при работе в испытательном стенде. Добавьте следующий глобально переопределить метод ngOnDestroy NgbTooltip в:

NgbTooltip.prototype.ngOnDestroy = function() { 
    this.close(); 
    //this._unregisterListenersFn(); 
    this._zoneSubscription.unsubscribe(); 
}; 

Третья линия закомментированы останавливает ошибку, появляющуюся в моих модульных тестах. Немного взлома, но в модульных тестах должно быть хорошо. Я думаю, что эта функция не инициализируется в ngOnInit() правильно при запуске в тестовом устройстве.

Я попытался переопределить директиву NgbTooltip с помощью overrideDirective(), но оригинал всегда вызывался независимо.

Чтобы найти фактическую ошибку, я добавил следующий к моему единичную тестовую спецификацию:

afterEach(() => { 
    fixture.destroy(); 
}); 

Это то отображается фактическое исключение, которое, казалось, происходит:

TypeError: this._unregisterListenersFn is not a function 
at NgbTooltip.webpackJsonp.../../../../@ng-bootstrap/ng-bootstrap/tooltip/tooltip.js.NgbTooltip.ngOnDestroy (http://localhost:9876/_karma_webpack_/vendor.bundle.js:4522:14) 
at callProviderLifecycles (http://localhost:9876/_karma_webpack_/vendor.bundle.js:103669:18) 
at callElementProvidersLifecycles (http://localhost:9876/_karma_webpack_/vendor.bundle.js:103638:13) 
at callLifecycleHooksChildrenFirst (http://localhost:9876/_karma_webpack_/vendor.bundle.js:103622:17) 
at destroyView (http://localhost:9876/_karma_webpack_/vendor.bundle.js:104948:5) 
at callViewAction (http://localhost:9876/_karma_webpack_/vendor.bundle.js:105094:13) 
at execComponentViewsAction (http://localhost:9876/_karma_webpack_/vendor.bundle.js:105006:13) 
at destroyView (http://localhost:9876/_karma_webpack_/vendor.bundle.js:104947:5) 
at callViewAction (http://localhost:9876/_karma_webpack_/vendor.bundle.js:105094:13) 
at execComponentViewsAction (http://localhost:9876/_karma_webpack_/vendor.bundle.js:105006:13) 
1

Я хотел бы предложить только заглушка в начале:

// fix 'Error during cleanup of component' 
NgbTooltip.prototype.ngOnDestroy = jasmine.createSpy('ngOnDestroy'); 
(NgbTooltip.prototype.ngOnDestroy as jasmine.Spy).and.stub(); 

 Смежные вопросы

  • Нет связанных вопросов^_^