Тестирование Angular + Redux Jasmine "Невозможно прочитать свойство 'dispatch' of undefined", случайно выбрасываемое в прогоны
У меня есть интеграционный тест, который зависит от 2 сервисов, которые я предоставляю на тестовый стенд с заглушками.
Когда я тестирую функцию updateCategory()
в блоке подписки этой категории у меня есть функция ngRedux.dispatch({тип: что-то})
Ошибка: TypeError: Cannot read property 'dispatch' of undefined
случайным образом выбрасывается, даже если служба отключена и функция предоставлена. По какой-то странной причине он считает, что это собственность сервиса.
Эта ошибка генерируется без внесения каких-либо изменений в тест, просто обновляя страницу кармы:
- При случайном тестировании каждый раз.
- Иногда все тесты проходят с ошибкой только в консоли.
- Иногда перестает пробовать другие тесты после выдачи ошибки.
- Иногда выдает ошибку при прохождении всех тестов.
Это настолько непредсказуемо, что для меня это вообще не имеет никакого смысла.
Конфигурация TestBed:
describe('AdminCategoriesComponent', () => {
let component: AdminCategoriesComponent;
let fixture: ComponentFixture<AdminCategoriesComponent>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
MatSnackBarModule,
ReactiveFormsModule,
FormsModule,
MatInputModule,
MatExpansionModule,
BrowserAnimationsModule,
NgReduxTestingModule
],
declarations: [AdminCategoriesComponent],
providers: [
{ provide: AdminService, useClass: AdminStub },
{ provide: NgRedux, useclass: MockNgRedux }
],
schemas: [NO_ERRORS_SCHEMA]
})
.compileComponents()
.then(() => {
MockNgRedux.reset();
fixture = TestBed.createComponent(AdminCategoriesComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
}));
Тестовая конфигурация:
it('should update category', () => {
component.categoryID = 1;
component.categoryTitle = 'Test Category Title';
component.categoryDescription = 'Test Category Description';
component.ngOnInit();
fixture.detectChanges();
component.categoryForm.value.categoryTitle = 'New Category Title';
component.categoryForm.value.categoryDescription =
'New Category Description';
component.updateCategory();
fixture.detectChanges();
expect(component.localLoading).toBeFalsy();
});
Без теста выше - ошибка не выдается. И без функции диспетчеризации в этом блоке подписки ошибка также не выдается.
0 ответов
Модуль angular-redux устарел и просто мусор, это становится намного очевиднее, когда вы пытаетесь запустить с ним какие-либо тесты. Через год после перехода на @ ngrx/store и правильного изучения работы с наблюдаемыми объектами решение состоит в том, чтобы использовать @ ngrx/store или fork angular-redux и самостоятельно исправить ошибки.