Angular 2/4/6/7 - Unit Testing with Router

后端 未结 4 888

In Angular 2.0.0, I am unit testing a component that uses Router. However I get the \'Supplied parameters do not match any signature of call target.\' error. In Visual studi

4条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-27 14:45

    Here an axample if we inject Route service in our component controller:

    import { TestBed, async } from '@angular/core/testing';
    import { RouterTestingModule } from '@angular/router/testing'; // Because we inject service in our component
    import { Router } from '@angular/router'; // Just if we need to test Route Service functionality
    
    import { AppComponent } from './app.component';
    import { DummyLoginLayoutComponent } from '../../../testing/mock.components.spec'; // Because we inject service in your component
    
    describe('AppComponent', () => {
      let router: Router; // Just if we need to test Route Service functionality
    
      beforeEach(async(() => {
        TestBed.configureTestingModule({
          declarations: [
            AppComponent,
            DummyLoginLayoutComponent // Because we inject service in our component
          ],
          imports: [
            RouterTestingModule.withRoutes([
              { path: 'login', component: DummyLoginLayoutComponent },
            ]) // Because we inject service in our component
          ],
        }).compileComponents();
    
        router = TestBed.get(Router); // Just if we need to test Route Service functionality
        router.initialNavigation(); // Just if we need to test Route Service functionality
      }));
    
      it('should create the app', async(() => {
        const fixture = TestBed.createComponent(AppComponent);
        const app = fixture.debugElement.componentInstance;
        expect(app).toBeTruthy();
      }));
    });
    

    We can also test other functionalitites such as navigate(). Just in case:

    it('should call eventPage once with /register path if event is instanceof NavigationStart', fakeAsync(() => {
        spyOn(analyticService, 'eventPage');
        router.navigate(['register'])
          .then(() => {
            const baseUrl = window.location.origin;
            const url = `${baseUrl}/register`;
            expect(analyticService.eventPage).toHaveBeenCalledTimes(1);
            expect(analyticService.eventPage).toHaveBeenCalledWith(url);
          });
    }));
    

    My file with all mock components (mock.components.specs.ts)

    import { Component } from '@angular/core';
    
    @Component({
        selector: 'home',
        template: '
    Dummy home component
    ', styleUrls: [] }) export class DummyHomeComponent { }

提交回复
热议问题