Маршруты модульного тестирования с конфигурацией Mock ActivatedRoute - PullRequest
1 голос
/ 24 мая 2019

Я настраиваю тестовую спецификацию для моего компонента, который имеет маршруты, также я определил мою спецификацию с зависимостями следующим образом.И у ActivatedRoute есть эти свойства, но я не вижу, чтобы его объект / экземпляр создавался при отладке моей тестовой спецификации.Также я упомянул разные способы насмешки ActivatedRoute, но ничто не помогает мне.Пожалуйста, исправьте меня, если я делаю что-то не так

class UserInfotypeDetailComponent implements OnInit, OnDestroy {
    constructor(
        private userInfotypeDetailService: UserInfotypeDetailService,
        private appLookupService: AppLookupService,
        private router: Router,
        private activatedRoute: ActivatedRoute
    ) {}

 performAction(event: { action: string; objectKey: string | null }) {
    let extras: any = { relativeTo: this.activatedRoute };
    if (event.objectKey) {
          extras.queryParams = { objectKey: event.objectKey };
    }

    switch (event.action) {
      case "new":
      case "edit":
      case "copy":
      case "view":
        this.router.navigate([event.action], extras);
        break;
      case "delete":
        this.deleteRecord(event.objectKey as string);
    }
  }

}

Вот мои маршруты:

{
        path: "infotype/:id",
        component: UserInfotypeDetailComponent,
        outlet: "slidein",
        children: [
          {
            path: "new",
            component: UserRecordFormComponent,
            data: { actionId: "A", buttonDesc: "Save" }
          },
          {
            path: "edit",
            component: UserRecordFormComponent,
            data: { actionId: "E", buttonDesc: "Update" }
          },
          {
            path: "copy",
            component: UserRecordFormComponent,
            data: { actionId: "C", buttonDesc: "Save" }
          },
          {
            path: "view",
            component: UserRecordFormComponent,
            data: { actionId: "V", actionDesc: "View" }
          }
        ]
      }

И моя тестовая спецификация выглядит следующим образом:

beforeEach(async(() => {
        TestBed.configureTestingModule({
            imports: [
              RouterTestingModule.withRoutes([]),
                BrowserAnimationsModule,
                RouterModule
            ],
            declarations: [
                UserInfotypeDetailComponent
            ],
            providers: [
                { provide: ActivatedRoute, useValue: {
                                          outlet: "slidein",
                                          params: of({ 
                                              id: "0009"
                                          })
                                      }
                },
                { provide: AppLookupService, useClass: AppLookupServiceStub },
                { provide: UserInfotypeDetailService, useClass: UserInfotypeDetailServiceStub },
                { provide: Router, useClass: AppRouterStub }
            ],
            schemas: [NO_ERRORS_SCHEMA]
        }).compileComponents();
    }));

    class AppRouterStub {
        navigate() {}
    }

Иконтрольный пример:

it('make expect calls to router navigate', fakeAsync(() => {
      let router = TestBed.get(Router);
      let spy = spyOn(router, 'navigate');

      component.performAction(event);

      let extras: any = { relativeTo: ActivatedRoute };
      if (event.objectKey) {
        extras.queryParams = { objectKey: event.objectKey };
      }
      fixture.detectChanges();

      expect(spy).toHaveBeenCalledWith([event.action], extras);
    }))

Ошибка, которую он выдает:

"шпионская навигация, вызванная с [['edit'], Object ({lativeTo: Function,queryParams: Object ({objectKey: '36353539363A393C3535353E352525252525253E3E3E3E363738363735363E35363536353535'})})]], но фактическими вызовами были [['edit'], Object ({lativeTo: Object ({snapshot: Object ({ject)({_isScalar: false, наблюдатели: [], закрыто: false, isStopped: false, hasError: false, thrownError: null})}), params: Subject ({_isScalar: false, наблюдатели: [], закрыто: false, isStopped: false, hasError: false, thrownError: null}), queryParams: Subject ({_isScalar: false, наблюдатели: [], закрытый: false, isStopped: false, hasError: false, thrownError: null}), testParams: Object ({id: '0009'})}), queryParams: Object ({objectKey:'36353539363A393C3535353E352525252525253E3E3E3E363738363735363E35363536353535'})})]. "

1 Ответ

0 голосов
/ 26 мая 2019

Сбой, потому что с

let extras: any = { relativeTo: ActivatedRoute };

вы на самом деле используете ActivatedRoute angular, но вы должны использовать useValue, который вы определили в providers.

Сделать активированнымRoute public в constructor компонента, чтобы мы могли получить к нему доступ

public activatedRoute: ActivatedRoute,
public router : Router

Попробуйте:

it('make expect calls to router navigate', fakeAsync(() => {
      spyOn(component.router, 'navigate');

      component.performAction(event);
      // I hope you have defined "event" somewhere in code, because I can't see
      // it anywhere here !

      let extras: any = { relativeTo: component.activatedRoute};
      if (event.objectKey) {
        extras.queryParams = { objectKey: event.objectKey };
      }

      expect(component.router.navigate).toHaveBeenCalledWith([event.action], extras);
    }))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...