Angular 角4中的每个组件都需要单元测试吗?

Angular 角4中的每个组件都需要单元测试吗?,angular,unit-testing,Angular,Unit Testing,Angular 4随附cli工具。创建新组件时,它将生成组件文件、模板文件、样式表和等级库文件(单元测试) MainComponent除了作为其他组件的占位符之外,什么都不做,例如 main组件在其模板中包含以下内容 <navbar-component></navbar-component> <router-outlet></router-outlet> <footer-component></footer-component&

Angular 4随附
cli
工具。创建新组件时,它将生成组件文件、模板文件、样式表和等级库文件(单元测试)

MainComponent
除了作为其他组件的占位符之外,什么都不做,例如

main组件
在其模板中包含以下内容

<navbar-component></navbar-component> 
<router-outlet></router-outlet>
<footer-component></footer-component>

在单元测试文件(
main.component.spec.ts
)中,我们必须导入所有这些组件,以及其他依赖项(例如,如果您使用的是角材料库、图标模块或服务以及这三个组件的依赖项)、路由器模块和您必须存根路由器等


是否值得保留此组件的单元测试文件?或者,我应该删除这些类型组件的规范文件吗?您必须将角度应用程序断开到不同的模块。不建议只使用一个模块创建多个组件的整个应用程序

也就是说,您可以在配置
测试床时导入包含main组件的模块。在
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

编辑 做这件事要小心。这样做是解决原始问题的捷径。因为您使用的是真正的服务,而不是嘲笑它们。因此,如果您使用的是调用服务器的服务,那么您的测试也将调用服务器。如果您的服务处理本地存储,那么您的测试也将处理本地存储

更好的方法是将
自定义元素\u模式
服务存根
相结合

自定义元素\u架构
将忽略

  • 任何名称中带有-的非角度元素
  • 名称中带有-的元素上的任何属性,这是自定义元素的常见规则
因此,如果您正在使用一些

注入真正的用户服务可能是一场噩梦。真正的服务可能会要求用户提供登录凭据,并尝试访问身份验证服务器。这些行为可能很难被拦截。创建和注册一个test-double来代替real-UserService更容易、更安全


测试代码是最佳实践,但是,如果组件没有做任何事情,那么就没有什么可测试的。我仍然会保留spec文件,以防将来有人添加功能

如果不需要测试周期,则可以使用
--skip tests
--minimal
标志运行
ng new
。后者还会将样式和模板文件内联

请记住,cli将为您完成大部分工作,您可以始终在您的测试床模块中使用
模式:[CUSTOM\u ELEMENTS\u SCHEMA]
,让测试忽略模板中引用的组件

参考资料:


谢谢,我不知道我们可以直接导入AppModule!
beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [
      AppComponent
    ],
    schemas: [CUSTOM_ELEMENTS_SCHEMA]
  }).compileComponents();
}));