Je suis nouveau sur angular 4 et j'essaie de tester l'une des angular 4 fonctionnalité router.paramMap des tests unitaires, lire les paramètres de l'itinéraire de manière jachère et travailler comme attendu dans ma candidature.
constructor(private router:Router, private actRoute:ActivatedRoute) {
}
ngOnInit() {
this.router.paramMap.subscribe(params => {
params.get(id);
})
......
}
Mais lors de l'exécution du test unitaire, j'obtiens une erreur qui dit ne peut pas appeler la méthode d'abonnement indéfinie même si je passe le paramètre de route de passage comme ci-dessous.
{
provide: ActivatedRoute,
useValue: { params: Observable.of({id: 1}) }
}
Veuillez suggérer
Vous devez fournir paramMap
au lieu de params
. paramMap
doit être de type ParamMap
from @angular/router
, donc l'objet normal peut être converti en ParamMap
en utilisant la méthode convertToParamMap()
from @angular/routing
.
Vous pouvez fournir la maquette ActivatedRoute comme ci-dessous:
import { convertToParamMap} from '@angular/router';
....
.....
{
provide: ActivatedRoute,
useValue: { paramMap: Observable.of(convertToParamMap({id: 1})) }
}
J'utilise une méthode légèrement différente pour obtenir les paramètres de mon composant:
this.id = this.route.snapshot.paramMap.get('id');
Et c'est ce qui a fonctionné pour moi dans le test au jasmin:
{
provide: ActivatedRoute,
useValue: {
snapshot: {
paramMap: convertToParamMap({id: 1})
}
}
}
Pour toute personne ayant besoin de tests sur un composant pour savoir quand il a un certain paramètre de route et quand il ne l'a pas (comme dans /product
et /product/:id
), les travaux suivants me conviennent:
Le composant:
export class PageProductComponent implements OnInit {
id: string | null = null;
constructor(private readonly activatedRoute: ActivatedRoute) { }
ngOnInit(): void {
this.id = this.activatedRoute.snapshot.paramMap.get('id');
}
}
Les tests:
describe('PageProductComponent ', () => {
let component: PageProductComponent ;
let fixture: ComponentFixture<PageProductComponent >;
let debugEl: DebugElement;
const makeCompiledTestBed = (provider?: object): void => {
const moduleDef: TestModuleMetadata = {
imports: [
RouterTestingModule,
],
declarations: [ PageProductComponent ],
providers: [ ]
};
if (moduleDef.providers && provider) {
moduleDef.providers.Push(provider);
}
TestBed.configureTestingModule(moduleDef).compileComponents();
};
const setupTestVars = (): void => {
fixture = TestBed.createComponent(PageProductComponent );
component = fixture.componentInstance;
debugEl = fixture.debugElement;
fixture.detectChanges();
};
describe('When an ID is NOT provided in the URL param', () => {
beforeEach(async(makeCompiledTestBed));
beforeEach(setupTestVars);
it('should list all products', () => {
//...
});
});
describe('When an ID is provided in the URL param', () => {
beforeEach(async(() => {
makeCompiledTestBed({
provide: ActivatedRoute,
useValue: {
snapshot: {
paramMap: convertToParamMap({id: 1234})
}
}
});
}));
beforeEach(setupTestVars);
it('should show a specific product', () => {
//...
});
});
});
nous utilisons actuellement ceci:
{ provide: ActivatedRoute, useValue: { 'params': Observable.from([{ 'id': '1'}]) } },
Votre code a un problème, pour obtenir un paramètre de l'URL, vous devez écrire les choses d'une manière différente.
constructor(private router:Router, private actRoute:ActivatedRoute) {
}
ngOnInit() {
this.router.paramMap
.switchMap((params: ParamMap) => {
params.get(id);
....
})
.subscribe((....) => {
....
})
}