我有一个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中,未导入到您的测试台配置中.
原文链接:/angularjs/142192.html如果你不关心测试任何实际的实际路由(我注意到模拟路由器),那么你可以让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所述