mou*_*a20 10 angular2-routing angular2-testing angular
我有一个html所在的homecomponent
//home.component.html
<router-outlet></router-outlet>
Run Code Online (Sandbox Code Playgroud)
//home.component.ts
import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';
import { HomeService} from './shared/services/home.service';
@Component({
// moduleId: module.id,
selector: 'app-home',
templateUrl: 'home.component.html',
styleUrls: ['home.component.css'],
providers:[HomeService]
})
export class HomeComponent implements OnInit {
constructor(private service:HomeService , private route:Router) { }
ngOnInit() {
if(this.service.isAuthenticated()){
this.route.navigateByUrl('dashboard/main');
}
}
}
Run Code Online (Sandbox Code Playgroud)
//home.component.spec.ts
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
import { DebugElement } from '@angular/core';
import { async, inject } from '@angular/core/testing';
import { HomeComponent } from './home.component';
import { Router} from '@angular/router';
import { HomeService } from './shared/services/home.service';
class RouterStub {
navigateByUrl(url: string) { return url }
}
class MockHomeService {
isAuthenticated() {
return true
}
}
let comp: HomeComponent;
let fixture: ComponentFixture<HomeComponent>;
describe('Component: HomeComponent', () => {
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [HomeComponent],
providers: [
{ provide: Router, useClass: RouterStub },
{ provide: HomeService, useClass: MockHomeService },
]
});
fixture = TestBed.createComponent(HomeComponent);
comp = fixture.componentInstance;
});
it('should tell ROUTER to navigate to dashboard/main if authencated',
inject([Router, HomeService], (router: Router, homeservice: HomeService) => {
const spy = spyOn(router, 'navigateByUrl');
comp.ngOnInit();
if (homeservice.isAuthenticated()) {
const navArgs = spy.calls.first().args[0];
expect(navArgs).toBe('dashboard/main');
}
}));
});
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
Error: Template parse errors:
'router-outlet' is not a known element:
1. If 'router-outlet' is an Angular component, then verify that it is pa
rt of this module.
2. If 'router-outlet' is a Web Component then add "CUSTOM_ELEMENTS_SCHEM
A" to the '@NgModule.schema' of this component to suppress this message. ("<div
class="">
[ERROR ->]<router-outlet></router-outlet>
</div>
"): HomeComponent@1:4
at TemplateParser.parse (http://localhost:9876/_karma_webpack_/0.bun
dle.js:21444:19)
at RuntimeCompiler._compileTemplate (http://localhost:9876/_karma_we
bpack_/0.bundle.js:6569:51)
at http://localhost:9876/_karma_webpack_/0.bundle.js:6492:83
at Set.forEach (native)
at compile (http://localhost:9876/_karma_webpack_/0.bundle.js:6492:4
7)
at RuntimeCompiler._compileComponents (http://localhost:9876/_karma_
webpack_/0.bundle.js:6494:13)
at RuntimeCompiler._compileModuleAndAllComponents (http://localhost:
9876/_karma_webpack_/0.bundle.js:6411:37)
at RuntimeCompiler.compileModuleAndAllComponentsSync (http://localho
st:9876/_karma_webpack_/0.bundle.js:6399:21)
at TestingCompilerImpl.compileModuleAndAllComponentsSync (http://loc
alhost:9876/_karma_webpack_/0.bundle.js:10203:35)
at TestBed._initIfNeeded (webpack:///D:/myapp/transfer(9)/transfer/~
/@angular/core/bundles/core-testing.umd.js:1059:0 <- src/test.ts:4943:40)
Run Code Online (Sandbox Code Playgroud)
我在做什么错?
提前致谢
Pau*_*tha 11
该错误是因为1的<router-outlet>一部分未导入您的测试台配置.RouterModule
如果您不关心测试任何实际的实际路由(我注意到模拟路由器),那么您可以<router-outlet>通过将以下内容添加到您的测试台配置中来使Angular忽略该元素.
import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
TestBed.configureTestingModule({
schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
});
Run Code Online (Sandbox Code Playgroud)
只是一个建议.您希望测试组件上的行为,并且行为是在创建组件并对用户进行身份验证时,应调用路由器导航方法.所以我们应该测试一下调用导航方法.我们怎么做?与间谍.您可以从该navigateByUrl方法中创建一个间谍,然后您可以使用jasmine检查该方法是否被调用
import { getTestBed } from '@angular/core/testing';
class RouterStub {
navigateByUrl = jasmine.createSpy('navigateByUrl');
}
it('should navigate', () => {
fixture.detectChanges();
let router: Router = getTestBed().get(Router);
expect(router.navigateByUrl).toHaveBeenCalledWith('dashboard/main');
});
Run Code Online (Sandbox Code Playgroud)
现在您收到了一个缺少的Http提供程序错误.
因为你有providers:[HomeService]你的@Component,它会覆盖一个测试模块配置(也就是模拟).在这种情况下,您应该覆盖组件提供程序
TestBed.configureTestingModule({});
TestBed.overrideComponent(HomeComponent, {
set: {
providers: [
{ provide: HomeService, useClass: MockHomeService }
]
}
})
Run Code Online (Sandbox Code Playgroud)
1 - 对于测试,它实际应该是RouterTestingModule,如这里提到的
| 归档时间: |
|
| 查看次数: |
5832 次 |
| 最近记录: |