2016-10-25 4 views
2

Я пытаюсь выполнить модульное тестирование компонента углового2, который использует маршрут. У меня есть:Jasmine route spy - undefined не является объектом (оценка «navigate.calls.mostRecent(). Args»)

class MockRouter { 
} 

class MockAuth { 
    isLoggedIn(){ 
    return false; 
    } 
} 

describe('Home',() => { 
    beforeEach(() => TestBed.configureTestingModule({ 
    providers: [ 
     BaseRequestOptions, 
     { provide: Router, useClass: MockRouter }, 
     HomeComponent, 
     { provide: AuthenticationService, useClass: MockAuth } 
    ] 
    })); 

    it('should navigate to login', inject([HomeComponent], (home: HomeComponent) => { 
    let navigate = jasmine.createSpy('navigate'); 
    expect(navigate.calls.mostRecent().args[0]).toEqual(['/login']); 
    })); 
}); 

, но я получаю сообщение об ошибке:

TypeError: undefined is not an object (evaluating 'navigate.calls.mostRecent().args') in config/spec-bundle.js (line 41757)

Я думаю, что жасмин шпион это правильный подход, но я что-то пропустил -Что я делаю не так?

ответ

1

Вы должны добавить шпиона в класс MockRouter. Так что шпион шпионит на navigate звонки в Router

class MockRouter { 
    navigate = jasmine.createSpy('navigate'); 
} 

describe('Home',() => { 
    let mockRouter; 
    let fixture; 
    let component: HomeComponent; 

    beforeEach(() => { 
    mockRouter = new MockRouter(); 
    TestBed.configureTestingModule({ 
     declarations: [ HomeComponent ] 
     providers: [ 
      BaseRequestOptions, 
      { provide: Router, useValue: mockRouter }, 
      { provide: AuthenticationService, useClass: MockAuth } 
     ] 
     }); 
     fixture = TestBed.createComponent(HomeComponent); 
     component = fixture.createComponent; 
    }); 

    it('should navigate to login',() => { 
    // calls component.ngOnInit 
    fixture.detectChanges(); 

    // assuming some navigation has been done 
    expect(mockRouter.navigate).toHaveBeenCalledWith(['/login']); 
    }); 
}); 

Примечание:

  • HomeComponent в declarations, а не в providers
  • Мы считаем ссылку на макет в тесте, и используйте useValue вместо useClass при его настройке