【问题标题】:Angular: Unit testing lazy-loaded modules with routingAngular:使用路由对延迟加载模块进行单元测试
【发布时间】:2018-08-01 14:00:00
【问题描述】:

我在 Angular 中测试延迟加载模块时遇到了一些问题。这是我的.spec 文件:

  import { Location } from '@angular/common';
    import { TestBed, ComponentFixture } from '@angular/core/testing';
    import { RouterTestingModule } from '@angular/router/testing';
    import { Router } from '@angular/router';
    import { routes } from './app-routing.module';
    import { AppComponent } from './app.component';
    import { AppConfigService } from './services/appConfig.service';
    import { TranslateModule } from '@ngx-translate/core';
    import { NgModuleFactoryLoader } from '@angular/core';
    import { VehicleModule} from './views/vehicle/vehicle.module';
    import { DriverModule} from './views/driver/driver.module';
    import { BrowserAnimationsModule } from '@angular/platform-browser/animations';

    describe('Router: App', () => {

      let location: Location;
      let router: Router;
      let fixture: ComponentFixture<AppComponent>;
      let loader: any;

      beforeEach(() => {
        TestBed.configureTestingModule({
          imports: [
            BrowserAnimationsModule,
            TranslateModule.forRoot(),
            RouterTestingModule.withRoutes(routes),
          ],
          declarations: [AppComponent],
          providers: [AppConfigService]
        });

        router = TestBed.get(Router);
        location = TestBed.get(Location);

        loader = TestBed.get(NgModuleFactoryLoader);
        loader.stubbedModules = {
          'VehicleModule': VehicleModule,
          'DriverModule': DriverModule
        };

        fixture = TestBed.createComponent(AppComponent);

        router.resetConfig([
          {
            path: 'vehicle',
            loadChildren: 'VehicleModule'
          },
          {
            path: 'driver',
            loadChildren: 'DriverModule'
          },
          {
            path: '',
            loadChildren: 'VehicleModule'
          }
        ]);

        fixture = TestBed.createComponent(AppComponent);
        router.initialNavigation();
      });

      it('should create APP', () => {
        expect(fixture.componentInstance).toBeDefined();
      });

      it('lazily navigates to "/driver"',(() => {
        router.navigate(['/driver']);
        expect(location.path()).toBe('/driver');
      }));
    });

这是我通过运行测试得到的:

 Expected '' to be '/driver'.

路由在应用程序上运行良好,问题仅在单元测试会话期间出现。

我错过了什么?

我正在使用 karma 1.7.1、Angular 6、jasmine 2.99.1

谢谢。

【问题讨论】:

    标签: angular unit-testing angular2-routing karma-jasmine


    【解决方案1】:

    可能有点过时了,不过这里是我懒加载模块测试的代码。

    模块的路径是:

    {path: 'student', loadChildren: './student/student.module#StudentModule', canLoad: [AuthGuard]}

    it('should navigate to /student lazy loaded ,pdule', fakeAsync(() => {
    
            const loader = TestBed.get(NgModuleFactoryLoader);
            loader.stubbedModules = {lazyModule: StudentModule};
    
            router.resetConfig([
              {path: 'student', loadChildren: 'lazyModule'},
            ]);
    
            router.navigate(['student'])
    
            tick();
    
            expect(location.path()).toBe('/student');
          }));
    

    什么时候删除:

    router.resetConfig([
              {path: 'student', loadChildren: 'lazyModule'},
            ]);
    

    将抛出异常:预期 '' 为 '/student'。

    我还附加了 TestBed 配置:

        let location: Location;
            let router: Router;
            let fixture;
              beforeEach(()=> {
                TestBed.configureTestingModule({
                    imports: [
                        BrowserAnimationsModule,
                        RouterTestingModule.withRoutes(routes),
                        SharedModule,
                        AuthModule,
                        MaterialModule,
                        StoreModule.forRoot(reducers),
                        EffectsModule.forRoot([AuthEffects, UserEffects])
                    ],
                    declarations: [
                        AppComponent,
                        WelcomeComponent,
                        NavbarComponent,
                        ProjectInfoComponent
                    ],
                    providers: [
                        Location
                    ]
                }).compileComponents();
    
                router = TestBed.get(Router);
                location = TestBed.get(Location);
                fixture = TestBed.createComponent(AppComponent);
                router.initialNavigation();
            });
    

    【讨论】:

      猜你喜欢
      • 2020-06-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 2017-08-21
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      相关资源
      最近更新 更多