2017-09-21 12 views
2

プロジェクトの単純な統合テストを実装しましたが、expect() save()メソッド。私がexpect()行をsetTimeout()に置くと、それは成功します。 setTimeout()なしで成功する方法?期待通りのスパイナビゲートが[['users']]で呼び出されましたが、インテグレーションテストで呼び出されたことはありませんCLI

spec.ts

import { Observable } from 'rxjs/Rx'; 
import { async, ComponentFixture, TestBed } from '@angular/core/testing'; 
import { By } from '@angular/platform-browser'; 
import { DebugElement } from '@angular/core'; 
import { Router, ActivatedRoute } from '@angular/Router'; 
import { UserDetailsComponent } from './user-details.component'; 
import { RouterTestingModule } from '@angular/router/testing'; 

class RouterStub { 
navigate(params) { }; 
} 
class ActivatedRouteStub { 
params: Observable<any> = Observable.empty(); 
} 
describe('UserDetailsComponent',() => { 
let component: UserDetailsComponent; 
let fixture: ComponentFixture<UserDetailsComponent>; 

beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
    imports: [RouterTestingModule], 
    declarations: [UserDetailsComponent], 
    providers: [ 
    { provide: Router, useClass: RouterStub }, 
    { provide: ActivatedRoute, useClass: ActivatedRouteStub } 
    ], 
}) 
    .compileComponents(); 
})); 

beforeEach(() => { 
fixture = TestBed.createComponent(UserDetailsComponent); 
component = fixture.componentInstance; 
}); 

it('should redirect the user to the users page after saving',() => { 
let router = TestBed.get(Router); 
let spy = spyOn(router, 'navigate'); 

component.save(); 

expect(spy).toHaveBeenCalledWith(['users']); 

}); 
}); 

エラー:

Expected spy navigate to have been called with [ [ 'users' ] ] but it was never called 

答えて

2

私はmockRouterの作成と呼ばれていnav()方法を確認することで解決し、同じ問題に直面しています。

この場合、HomeComponentは着陸コンポーネントであり、AppComponentrouter.navigateメソッドを持ちます。私app.component.ts

nav() { 
    this.router.navigate(['/home']); 
} 

そして、私のapp.component.spec.ts

import { TestBed, async, ComponentFixture, fakeAsync, tick,inject } from '@angular/core/testing'; 
import { By, BrowserModule } from '@angular/platform-browser'; 
import { AppComponent } from './app.component'; 
import { HomeComponent } from './home/home.component'; 
import { RouterModule, Routes } from '@angular/router'; 
import { Router, RouterOutlet,ActivatedRoute } from "@angular/router"; 
import { RouterTestingModule } from '@angular/router/testing'; 
import * as br from '@angular/platform-browser'; 

describe('Component:AppComponent',() => { 
    let component: AppComponent; 
    let fixture: ComponentFixture<AppComponent>; 
    let debugElement: DebugElement; 
    let location, router: Router; 
    let mockRouter; 

    beforeEach(() => { 
     mockRouter = { navigate: jasmine.createSpy('navigate') }; 
     TestBed.configureTestingModule({ 
      imports: [RouterTestingModule.withRoutes([ 
       { path: 'home', component: HomeComponent } 
      ])], 
      declarations: [AppComponent, HomeComponent], 
      providers: [ 
       { provide: Router, useValue: mockRouter}, 
      ] 
     }); 
    }); 

    beforeEach(() => { 
     fixture = TestBed.createComponent(AppComponent); 
     component = fixture.componentInstance; 
     debugElement = fixture.debugElement; 
    }); 

    it('should go home', async(() => { 
     fixture.detectChanges(); 
     component.nav(); 
     expect(mockRouter.navigate).toHaveBeenCalledWith(['/home']); 
    })); 
}); 
関連する問題