How to unit test a Angular 4 component which uses router.paramMap

后端 未结 5 877
星月不相逢
星月不相逢 2021-02-19 05:48

I m new to angular 4 and trying to test one of the angular 4 feature router.paramMap from unit tests, Reading route params in fallowing way and working as expected in my applica

5条回答
  •  慢半拍i
    慢半拍i (楼主)
    2021-02-19 06:06

    For anyone needing tests on a component for when it does have a certain route param, and when it does not have it (as in /product and /product/:id ), the following works for me:

    The component:

    export class PageProductComponent implements OnInit {
        id: string | null = null;
    
        constructor(private readonly activatedRoute: ActivatedRoute) { }
    
        ngOnInit(): void {
            this.id = this.activatedRoute.snapshot.paramMap.get('id');
        }
    }
    

    The tests:

    describe('PageProductComponent ', () => {
        let component: PageProductComponent ;
        let fixture: ComponentFixture;
        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', () => {
                //...
            });
        });
    });
    

提交回复
热议问题