พบปัญหาเดียวกันขณะสร้างชุดทดสอบสำหรับเส้นทางการกำหนดเส้นทางดังนี้:
{
path: 'edit/:property/:someId',
component: YourComponent,
resolve: {
yourResolvedValue: YourResolver
}
}
ในคอมโพเนนต์ฉันเริ่มต้นคุณสมบัติที่ส่งผ่านเป็น:
ngOnInit(): void {
this.property = this.activatedRoute.snapshot.params.property;
...
}
เมื่อเรียกใช้การทดสอบหากคุณไม่ผ่านค่าคุณสมบัติใน ActivatedRoute "useValue" จำลองของคุณคุณจะไม่ได้กำหนดเมื่อตรวจพบการเปลี่ยนแปลงโดยใช้ "fixture.detectChanges ()" เนื่องจากค่าจำลองสำหรับ ActivatedRoute ไม่มีคุณสมบัติ params.property จากนั้นจึงจำเป็นสำหรับการจำลอง useValue ที่จะต้องมีพารามิเตอร์เหล่านั้นเพื่อให้ฟิกซ์เจอร์เริ่มต้น 'this.property' ในคอมโพเนนต์ คุณสามารถเพิ่มเป็น:
let fixture: ComponentFixture<YourComponent>;
let component: YourComponent;
let activatedRoute: ActivatedRoute;
beforeEach(done => {
TestBed.configureTestingModule({
declarations: [YourComponent],
imports: [ YourImportedModules ],
providers: [
YourRequiredServices,
{
provide: ActivatedRoute,
useValue: {
snapshot: {
params: {
property: 'yourProperty',
someId: someId
},
data: {
yourResolvedValue: { data: mockResolvedData() }
}
}
}
}
]
})
.compileComponents()
.then(() => {
fixture = TestBed.createComponent(YourComponent);
component = fixture.debugElement.componentInstance;
activatedRoute = TestBed.get(ActivatedRoute);
fixture.detectChanges();
done();
});
});
คุณสามารถเริ่มการทดสอบได้เช่น:
it('should ensure property param is yourProperty', async () => {
expect(activatedRoute.snapshot.params.property).toEqual('yourProperty');
....
});
ตอนนี้สมมติว่าคุณต้องการทดสอบค่าคุณสมบัติอื่นจากนั้นคุณสามารถอัปเดต ActivatedRoute จำลองของคุณเป็น:
it('should ensure property param is newProperty', async () => {
activatedRoute.snapshot.params.property = 'newProperty';
fixture = TestBed.createComponent(YourComponent);
component = fixture.debugElement.componentInstance;
activatedRoute = TestBed.get(ActivatedRoute);
fixture.detectChanges();
expect(activatedRoute.snapshot.params.property).toEqual('newProperty');
});
หวังว่านี่จะช่วยได้!