【发布时间】:2017-02-04 11:18:38
【问题描述】:
错误说明
Angular 版本:2.3.1
我的单元测试无法创建组件 - 我知道这个问题与 [routerLink] 和 [routerLinkActive] 指令有关,因为从模板中删除它们允许测试创建组件。
模板
<nav class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button class="navbar-toggle" data-toggle="collapse" data-target="#iotahoe-top-navigation">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" [routerLink]="['/']">IoTahoe</a>
</div>
<div class="collapse navbar-collapse" id="iotahoe-top-navigation">
<ul *ngIf="isAuthenticated()" class="nav navbar-nav navbar-right">
<li [routerLinkActive]="['active']"><a [routerLink]="['/dashboard']">Dashboard</a></li>
<li [routerLinkActive]="['active']"><a [routerLink]="['/browse']">Browse</a></li>
<li [routerLinkActive]="['active']"><a [routerLink]="['/admin']">Admin</a></li>
<li [routerLinkActive]="['active']"><a (click)="onLogout()" style="cursor: pointer;">Logout</a></li>
</ul>
</div>
类型脚本
import { Component, OnInit } from '@angular/core';
import { AuthenticationService } from '../../authentication/authentication.service';
import { Router } from '@angular/router';
@Component({
moduleId: module.id.toString(),
selector: 'app-top-navbar',
templateUrl: './top-navbar.component.html',
styleUrls: ['./top-navbar.component.css']
})
export class TopNavbarComponent implements OnInit {
constructor(private authenticationService: AuthenticationService, private router: Router) { }
ngOnInit() {
}
isAuthenticated() {
return this.authenticationService.isLoggedIn;
}
onLogout() {
this.authenticationService.logout().subscribe(() => {
return this.router.navigate(['/login']);
});
}
}
测试规范
/* tslint:disable:no-unused-variable */
import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import {DebugElement, CUSTOM_ELEMENTS_SCHEMA, NO_ERRORS_SCHEMA, Component} from '@angular/core';
import { RouterTestingModule } from '@angular/router/testing';
import { Location, CommonModule } from '@angular/common';
import { TopNavbarComponent } from './top-navbar.component';
import { AuthenticationService } from '../../authentication/authentication.service';
import { Router } from '@angular/router';
import {ReactiveFormsModule} from "@angular/forms";
@Component({
template: ''
})
class DummyComponent {
}
describe('TopNavbarComponent', () => {
let component: TopNavbarComponent;
let fixture: ComponentFixture<TopNavbarComponent>;
let authenticationService: AuthenticationService;
beforeEach(async(() => {
const authenticationServiceStub = {
isLoggedIn: false
};
const routerStub = {
navigate: jasmine.createSpy('navigate'),
navigateByUrl: jasmine.createSpy('navigateByUrl')
};
TestBed.configureTestingModule({
declarations: [ TopNavbarComponent, DummyComponent ],
imports:[CommonModule, ReactiveFormsModule, RouterTestingModule.withRoutes(
[
{ path: '/', component:DummyComponent },
{ path: '/login', component:DummyComponent },
{ path: '/dashboard', component:DummyComponent },
{ path: '/browse', component:DummyComponent },
{ path: '/admin', component:DummyComponent }
])],
providers: [
{ provide: AuthenticationService, useValue: authenticationServiceStub },
{ provide: Router, useValue: routerStub }
]
}).compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(TopNavbarComponent);
component = fixture.componentInstance;
authenticationService = TestBed.get(AuthenticationService);
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
错误
zone.js:155 未捕获的错误:包中的错误:407:9:6 原因:不能 读取未定义的属性“根” 在 ViewWrappedError.Error (本机) 在 ViewWrappedError.ZoneAwareError (localhost:9876/base/src/test.ts:133296:33) 在 ViewWrappedError.BaseError [作为构造函数] (localhost:9876/base/src/test.ts:35630:16) 在 ViewWrappedError.WrappedError [作为构造函数] (localhost:9876/base/src/test.ts:35695:16) 在新的 ViewWrappedError (localhost:9876/base/src/test.ts:68018:16) 在 DebugAppView._rethrowWithContext (localhost:9876/base/src/test.ts:108242:23) 在 DebugAppView.create (localhost:9876/base/src/test.ts:108142:18) 在 DebugAppView.View_TopNavbarComponent_Host0.createInternal (/DynamicTestModule/TopNavbarComponent/host.ngfactory.js:16:19) 在 DebugAppView.AppView.createHostView (localhost:9876/base/src/test.ts:107700:21) 在 DebugAppView.createHostView (localhost:9876/base/src/test.ts:108156:52) 在 ComponentFactory.create (localhost:9876/base/src/test.ts:49830:25) 在 initComponent (localhost:9876/base/src/test.ts:6425:53) 在 ZoneDelegate.invoke (localhost:9876/base/src/test.ts:132727:26) 在 ProxyZoneSpec.onInvoke (localhost:9876/base/src/test.ts:95802:39) 在 ZoneDelegate.invoke (localhost:9876/base/src/test.ts:132726:32)Zone.runTask @ zone.js:155ZoneTask.invoke@zone.js:345data.args.(匿名函数) @zone.js:1376
【问题讨论】:
标签: unit-testing angular