3

我有一个集成测试,它依赖于我通过存根提供给测试平台的 2 项服务。

当我updateCategory()在这个类别的订阅块中测试一个函数时,我有一个函数 ngRedux.dispatch({type: something})

错误:TypeError: Cannot read property 'dispatch' of undefined即使服务被存根并提供了功能,也会随机抛出。出于某种奇怪的原因,它认为这是服务的属性。

抛出此错误,无需对测试进行任何更改,只需刷新 karma 页面:

  • 每次随机测试。
  • 有时所有测试都通过,但仅在控制台中出现错误。
  • 有时它会在抛出错误后停止尝试其他测试。
  • 有时它会在所有测试都通过时抛出错误。

它是如此不可预测,它对我来说根本没有意义。

测试床配置:

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();
  });

如果没有上面的测试——错误不会被抛出。如果没有该订阅块中的调度函数,也不会抛出错误。

4

1 回答 1

0

angular-redux 模块已经过时并且通常是垃圾,当您尝试使用它运行任何测试时,这变得更加明显。在切换到 @ngrx/store 并正确学习如何使用 observable 一年后,解决方案是使用 @ngrx/store 或 fork angular-redux 并自己修复错误。

于 2019-11-21T09:53:18.870 回答