Je travaille sur les tests unitaires sous mon angular 4.0.0, une méthode de mon composant réel appelle le routage manuel via:
method(){
....
this.navigateTo('/home/advisor');
....
}
avec naviguer vers est une méthode de routage personnalisée appelant ceci:
public navigateTo(url: string) {
this.oldUrl = this.router.url;
this.router.navigate([url], { skipLocationChange: true });
}
j'ai ce fichier de routage:
import ... // Components and dependencies
const homeRoutes: Routes = [
{
path: 'home', component: HomeComponent,
children: [
{
path: 'registration',
component: RegistrationComponent,
children: [
{
path: 'synthese',
component: SyntheseComponent
},
{
path: 'queue',
component: QueueComponent,
children: [
{
path: 'queue-modal',
component: QueueModalComponent
},
{
path: 'confirm',
component: ConfirmComponent
}
]
}
]
},
{
path: 'toolbox',
component: ToolboxComponent
},
{
path: 'appointment',
component: AppointmentRegistrationComponent
},
{
path: 'appointment-validation',
component: AppointmentValidationComponent
},
{
path: 'datepicker',
component: DatePickerComponent
},
{
path: 'validation/:defaultNumber',
component: ValidationComponent,
children: [
{
path: 'synthese',
component: SyntheseComponent
}
]
},
{
path: 'modalField',
component: ModalFieldComponent
},
{
path: 'search',
component: SearchComponent
},
{
path: 'advanced-search',
component: AdvancedSearchComponent
},
{
path: 'tools',
component: ToolsComponent
},
{
path: 'advisor',
component: AdvisorComponent
},
{
path: 'pilote',
component: PilotComponent
},
{
path: 'blank',
component: BlankComponent
},
{
path: 'view-360/:id',
component: View360Component,
children: [
{
path: 'client',
component: ClientComponent
},
{
path: 'tools',
component: ToolsAdvisorComponent
},
{
path: 'valid-close',
component: ValidCloseComponent
},
{
path: 'application',
component: ApplicationView360Component
}
],
canActivate: [AuthGuardAdviser]
},
{
path: 'view-360',
component: View360Component,
children: [
{
path: 'client',
component: ClientComponent
}
],
canActivate: [AuthGuardAdviser]
},
{
path: 'contract',
component: ContractComponent
},
{
path: 'queue-again',
component: QueueAgainComponent
},
{
path: 'stock',
component: StockComponent,
children: [
{
path: 'mobile',
component: MobileComponent
},
{
path: 'stock-level',
component: StockLevelComponent
}
]
},
{
path: 'usefull-number',
component: UsefullNumberComponent
},
{
path: 'admin',
loadChildren: 'app/home/admin/admin.module#AdminModule',
// component: AdminComponent,
canActivate: [AuthGuardAdmin]
},
{
path: 'rb',
loadChildren: 'app/home/rb/rb.module#RbModule',
// component: RbComponent
// canActivate: [AuthGuardAdmin]
},
{
path: 'tools-advisor',
component: ToolsAdvisorComponent
},
{
path: 'catalog/:haveClient',
component: CatalogComponent
},
{
path: 'application',
component: ApplicationComponent
},
]
},
];
@NgModule({
imports: [
CommonModule,
RouterModule.forChild(homeRoutes)
],
exports: [
RouterModule
],
declarations: []
})
export class HomeRoutingModule { }
Étrangement, même mon application fonctionne bien, mais le test renvoie cette erreur:
Échec: non capturé (promis): erreur: ne peut correspondre à aucun itinéraire. Segment d'URL: "home/advisor" Erreur: ne peut correspondre à aucun itinéraire. Segment URL: 'home/advisor'
il semble que j'ai une configuration manquante.
Toutes les idées ??
Suite à mon commentaire:
Lorsque vous souhaitez tester unitaire votre routeur, vous devez utiliser le module de test, pas le module réel.
Commencer avec
import { RouterTestingModule } from '@angular/router/testing';
Ensuite, dans votre banc d'essai
imports: [RouterTestingModule]
Vous devriez maintenant pouvoir tester votre composant
MODIFIER
Pour espionner votre routage, ce que vous devez faire, c'est
spyOn(component.router, 'navigate').and.returnValue(true);
Et vous vous attendez ressemblera à
expect(component.router.navigate).toHaveBeenCalledWith('/home/advisor');
Vous avez besoin RouterTestingModule.withRoutes
ainsi:
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule.withRoutes(
[{path: 'yourpath', component: BlankComponent}]
)
],
declarations: [
BlankComponent,
YourComponentBeingTested
]
})
.compileComponents()
}))
Dans ma console, j'obtiens cette erreur lors de l'exécution de mon cas de test unitaire à cause de SubRoute. Je peux résoudre ce problème en implémentant la manière suivante dans mon cas de test unitaire.
class RouterStub {
url = '';
navigate(commands: any[], extras?: any) { }
}
beforeEach(async(() => {
TestBed.configureTestingModule({
providers:[{ provide: Router, useClass: RouterStub }]
}).compileComponents();
}));
Je rencontre le même problème. La solution de réponse acceptée ne fonctionne pas pour moi, car j'ai accidentellement ajouté le HttpClientModule au lieu de HttpClientTestingModule à mes fichiers de spécifications. Pour éviter le problème "Ne peut correspondre à aucune route", assurez-vous d'ajouter RouterTestingModule et HttpClientTestingModule partout où cela est nécessaire.
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule,
HttpClientTestingModule,
],
declarations: [
AppComponent
],
}).compileComponents();
}));