我有一个html所在的homecomponent
//home.component.html
- <router-outlet></router-outlet>
//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');
- }
- }
- }
//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');
- }
- }));
- });
我收到以下错误
- 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)
我在做什么错?
提前致谢
该错误是因为< router-outlet>在部分RouterModule1中,未导入到您的测试台配置中.
如果你不关心测试任何实际的实际路由(我注意到模拟路由器),那么你可以让Angular忽略< router-outlet>通过在测试床配置中添加以下元素.
- import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
- TestBed.configureTestingModule({
- schemas: [ CUSTOM_ELEMENTS_SCHEMA ]
- });
只是一个建议.您希望测试组件上的行为,并且行为是在创建组件并对用户进行身份验证时,应该调用路由器导航方法.所以我们应该测试一下调用导航方法.我们怎么做?使用Spies.您可以通过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');
- });
UPDATE
现在你得到一个缺少的Http提供程序错误.
因为@Component上有提供者:[HomeService],它会覆盖测试模块配置中的提供者(即模拟).在这种情况下,您应该覆盖组件提供程序
- TestBed.configureTestingModule({});
- TestBed.overrideComponent(HomeComponent,{
- set: {
- providers: [
- { provide: HomeService,useClass: MockHomeService }
- ]
- }
- })
1 – 对于测试,它实际上应该是RouterTestingModule,如here所述