在我的app.component.ts中,我有以下ngOnInit函数:
ngOnInit() { this.sub = this.router.events.subscribe(e => { if (e instanceof NavigationEnd) { if (!e.url.includes('login')) { this.loggedIn = true; } else { this.loggedIn = false; } } }); }
目前我正在测试sub是否为null但我想测试100%覆盖率的函数.
我想模拟路由器对象,以便我可以模拟URL,然后测试是否正确设置了this.loggedIn.
我将如何进行模拟此功能?我尝试了但是我不知道如何通过涉及的回调和NavigationEnd来实现这一点.
我找到了答案,如果有人正在寻找它:
import { addProviders, async, inject, TestComponentBuilder, ComponentFixture, fakeAsync, tick } from '@angular/core/testing'; import { AppComponent } from './app.component'; import { Router, ROUTER_DIRECTIVES, NavigationEnd } from '@angular/router'; import { HTTP_PROVIDERS } from '@angular/http'; import { LocalStorage, WEB_STORAGE_PROVIDERS } from 'h5webstorage'; import { NavComponent } from '../nav/nav.component'; import { FooterComponent } from '../footer/footer.component'; import { Observable } from 'rxjs/Observable'; class MockRouter { public ne = new NavigationEnd(0, 'http://localhost:4200/login', 'http://localhost:4200/login'); public events = new Observable(observer => { observer.next(this.ne); observer.complete(); }); } class MockRouterNoLogin { public ne = new NavigationEnd(0, 'http://localhost:4200/dashboard', 'http://localhost:4200/dashboard'); public events = new Observable(observer => { observer.next(this.ne); observer.complete(); }); }
我从Angular docs创建了一个版本的路由器存根,它使用这个方法来实现NavigationEnd事件以进行测试:
import {Injectable} from '@angular/core';
import { NavigationEnd } from '@angular/router';
import {Subject} from "rxjs";
@Injectable()
export class RouterStub {
public url;
private subject = new Subject();
public events = this.subject.asObservable();
navigate(url: string) {
this.url = url;
this.triggerNavEvents(url);
}
triggerNavEvents(url) {
let ne = new NavigationEnd(0, url, null);
this.subject.next(ne);
}
}
接受的答案是正确的,但这有点简单,你可以更换
public ne = new NavigationEnd(0, 'http://localhost:4200/login', 'http://localhost:4200/login'); public events = new Observable(observer => { observer.next(this.ne); observer.complete(); });
通过:
public events = Observable.of( new NavigationEnd(0, 'http://localhost:4200/login', 'http://localhost:4200/login'));
并在下面找到一个完整的测试文件来测试问题中的函数:
import { NO_ERRORS_SCHEMA } from '@angular/core'; import { async, TestBed, ComponentFixture } from '@angular/core/testing'; /** * Load the implementations that should be tested */ import { AppComponent } from './app.component'; import { NavigationEnd, Router } from '@angular/router'; import { Observable } from 'rxjs/Observable'; class MockServices { // Router public events = Observable.of( new NavigationEnd(0, 'http://localhost:4200/login', 'http://localhost:4200/login')); } describe(`App`, () => { let comp: AppComponent; let fixture: ComponentFixture; let router: Router; /** * async beforeEach */ beforeEach(async(() => { TestBed.configureTestingModule({ declarations: [ AppComponent ], schemas: [NO_ERRORS_SCHEMA], providers: [ { provide: Router, useClass: MockServices }, ] }) /** * Compile template and css */ .compileComponents(); })); /** * Synchronous beforeEach */ beforeEach(() => { fixture = TestBed.createComponent(AppComponent); comp = fixture.componentInstance; router = fixture.debugElement.injector.get( Router); /** * Trigger initial data binding */ fixture.detectChanges(); }); it(`should be readly initialized`, () => { expect(fixture).toBeDefined(); expect(comp).toBeDefined(); }); it('ngOnInit() - test that this.loggedIn is initialised correctly', () => { expect(comp.loggedIn).toEqual(true); }); });