Angular中的单元测试

Posted wyp1988

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Angular中的单元测试相关的知识,希望对你有一定的参考价值。

  • 基本
    • 在项目根目录下执行ng test命令即执行单元测试
    • 每个component下面的xxx.component.spec.ts就是该component对应的单元测试文件
    • 依赖
      • 如果该component依赖了新的module,即使是配在上级的xxx.module.ts中的,这个xxx.component.spec.ts单元测试文件中也要单独引用该新module
        • 其实这个和java等语言的单元测试一样,单元测试本身不使用项目配置的依赖,而是自己进行引用。
      • 可以使用@Component+class ScreenshotComponent定义要依赖的component(其实和在单独的文件里定义component类似,只是class前面没有加export),用于后面引入依赖
        • 在这些定义的要依赖的component中,需要声明该业务component中的成员及类型,如selectedXXX;
      • 在这段代码中定义和编译依赖的module和component:describe(‘XXXComponent‘, () => beforeEach(async(() => TestBed.configureTestingModule(…...).compileComponents();)););
    • 测试准备
      • 这些包含在beforeEach中的脚本貌似只是相当于测试准备,类似于在Junit的BeforeTest中准备测试环境、资源。beforeEach可以有多个,可以有异步的。
    • jasmine.createSpyObj
  • 下面的实例单元测试脚本,其实没有测什么逻辑,只是试着加载了一下component,看有没有报错。
import  async, ComponentFixture, TestBed  from '@angular/core/testing';

import  XXXComponent from './xxx.component';
import  Component, Input  from '@angular/core';
import  NavbarService  from '../../core/navbar/navbar.service';
import  of  from 'rxjs/observable/of';
import  ActivatedRoute  from '@angular/router';
import  Logger  from 'sinint-application-core-spa';
import  XXXService  from '../shared/xxx.service';
import  TimeframeService  from '../shared/timeframe.service';
import  XXX  from '../models/xxx.model';
import  InfiniteScrollModule  from 'ngx-infinite-scroll';

@Component( selector: 'xxx-screenshot', template: '' )
class XXXScreenshotStubComponent 
  @Input() initWithRootAtStart = false;
  @Input() selectedXXX: string;


describe('XXXComponent', () => 
  let component: XXXComponent;
  let fixture: ComponentFixture<XXXComponent>;

  const urlSegment = [ path: '', parameters: [] ];
  const route =  url: of(urlSegment), snapshot: '' ;

  beforeEach(async(() => 
    const xxxService = jasmine.createSpyObj('XXXService', ['getChildrenXXX', 'getXXX']);
    const timeframeService = jasmine.createSpyObj('TimeframeService', ['getSelectedtimeframe']);
    const navbarService = jasmine.createSpyObj('NavbarService', ['canNavigateBack']);
    const logger = jasmine.createSpyObj('Logger', ['error', 'info']);

    timeframeService.getSelectedtimeframe.and.returnValue(of( count: 24, unit: 'today', value: 'today' ));

    TestBed.configureTestingModule(
      imports: [InfiniteScrollModule],
      declarations: [
        XXXComponent
      ],
      providers: [
         provide: XXXService, useValue: xxxService ,
         provide: TimeframeService, useValue: timeframeService ,
         provide: NavbarService, useValue: navbarService ,
         provide: ActivatedRoute, useValue: route ,
         provide: Logger, useValue: logger 
      ]
    )
      .compileComponents();
  ));

  beforeEach(() => 
    fixture = TestBed.createComponent(XXXComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();
  );

  it('should create', () => 
    expect(component).toBeTruthy();
  );
);

以上是关于Angular中的单元测试的主要内容,如果未能解决你的问题,请参考以下文章

Angular中的单元测试socket.io

Angular2(TypeScript)中的单元测试/模拟窗口属性

Jest 单元测试中的 Angular 循环依赖问题

询问 Angular 2 单元测试中的 Coverage 摘要?

Angular 单元测试中业力代码覆盖率报告中的 1x 3x 等是啥意思?

Jasmine 使用 Angular 中的 TypeScript 对文件大小进行单元测试