您必须将 Angular 应用程序分解为不同的模块。不建议仅使用一个模块创建包含许多组件的整个应用程序。
话虽如此,您可以在配置TestBed 时导入包含主组件的模块。在main.component.spec.ts 中,你会像这样导入其他组件
之前
beforeEach(async(() => {
TestBed.configureTestingModule({
imports:[RouterModule.forRoot(routes)
....
....],
declarations: [NavbarComponent,
FooterComponent
....
....]
})
.compileComponents();
}));
相反,您可以直接导入 AppModule。
之后
import AppModule from '../app.module'
beforeEach(async(() => {
TestBed.configureTestingModule({
imports:[AppModule]
})
.compileComponents();
}));
这里AppModule包含组件NavbarComponent、FooterComponent。
编辑
谨慎行事。这样做是解决原始问题的捷径。因为您使用的是真实的服务,而不是嘲笑它们。因此,如果您正在使用调用服务器的服务,那么您的测试也将调用服务器。如果您的服务处理本地存储,那么您的测试也将操作本地存储。
更好的方法是结合CUSTOM_ELEMENTS_SCHEMA 和stubbing of services。
CUSTOM_ELEMENTS_SCHEMA 将忽略
- 任何名称中带有 - 的非 Angular 元素,
- 元素名称中带有 - 的任何属性,这是自定义元素的通用规则。
因此,如果您使用 <md-icon> 或 <app-footer>,它不会引发错误。
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [
AppComponent
],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
}).compileComponents();
}));
通过存根您的路由器,您将避免访问您的服务器,这是推荐的方式。请在offical angular guide 阅读有关存根服务的更多信息
注入真正的 UserService 可能是一场噩梦。真正的服务可能会要求用户提供登录凭据并尝试访问身份验证服务器。这些行为很难被拦截。代替真正的 UserService 创建和注册测试替身要容易和安全得多。