我有一个家庭组件,其中html是
// 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)
我在做什么错误?
提前致谢
答案 0 :(得分:10)
错误是因为<router-outlet>
1 的一部分RouterModule
未导入您的测试台配置。
如果您不关心测试任何实际的实际路由(我注意到模拟路由器),那么您可以通过将以下内容添加到您的测试台配置中来使Angular忽略<router-outlet>
元素。 / p>
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');
});
现在您收到了Http
提供程序错误。
因为providers:[HomeService]
上有@Component
,它会覆盖测试模块配置中的那个(模拟)。在这种情况下,您应该覆盖组件提供程序
TestBed.configureTestingModule({});
TestBed.overrideComponent(HomeComponent, {
set: {
providers: [
{ provide: HomeService, useClass: MockHomeService }
]
}
})
1 - 对于测试,它实际应该是RouterTestingModule
,如上所述here
答案 1 :(得分:2)
如果您不想测试路由但想要测试组件的功能,则只需添加
即可
<!-- app.component.spec.ts -->
import { RouterTestingModule } from '@angular/router/testing';
TestBed.configureTestingModule({
imports: [RouterTestingModule],
declarations: [AppComponent],
});
这允许您的测试在不禁用CUSTOM_ELEMENTS_SCHEMA
的情况下运行