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

后端 未结 5 861
星月不相逢
星月不相逢 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条回答
  • 2021-02-19 06:06

    I am using a slightly different method of getting the params in my component:

    this.id = this.route.snapshot.paramMap.get('id');
    

    And this is what worked for me in the jasmine test:

    {
          provide: ActivatedRoute,
          useValue: {
            snapshot: {
              paramMap: convertToParamMap({id: 1})
            }
          }
    }
    
    0 讨论(0)
  • 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<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', () => {
                //...
            });
        });
    });
    
    0 讨论(0)
  • 2021-02-19 06:07

    Your code has a problem, in order to get a param from the URL, you have to write things in a different way.

    constructor(private router:Router, private actRoute:ActivatedRoute) {
    }
    
    ngOnInit() {
        this.router.paramMap
            .switchMap((params: ParamMap) => {
                params.get(id);
                ....
            })
            .subscribe((....) => {
                ....
            })
    }
    
    0 讨论(0)
  • 2021-02-19 06:07

    You need to provide paramMap instead of params. paramMap should be of type ParamMap from @angular/router, so normal object can be converted to ParamMap using the method convertToParamMap() from @angular/routing.

    You can provide the mock ActivatedRoute like below:

    import { convertToParamMap} from '@angular/router';
    ....
    .....
    
    {
          provide: ActivatedRoute,
          useValue: { paramMap: Observable.of(convertToParamMap({id: 1})) }
    }
    
    0 讨论(0)
  • 2021-02-19 06:29

    we're currently using this:

        { provide: ActivatedRoute, useValue: { 'params': Observable.from([{ 'id': '1'}]) } },
    
    0 讨论(0)
提交回复
热议问题