如何在Angular 6中测试应用程序/根组件

如何在Angular 6中测试应用程序/根组件,angular,angular6,angular-test,angular-unit-test,Angular,Angular6,Angular Test,Angular Unit Test,最近我有两个与应用程序组件相关的失败测试用例。使用fixture.detectChanges()时,测试用例失败,出现错误“ExpressionChangedTerithasBeenCheckedError:Expression在检查后已更改。以前的值:“isValid:undefined”。当前值:“isValid:true” 似乎fixture.detectChanges()无法与应用程序组件一起正常工作 这是我的规范文件: import { ComponentFixture, TestBe

最近我有两个与应用程序组件相关的失败测试用例。使用
fixture.detectChanges()
时,测试用例失败,出现错误
“ExpressionChangedTerithasBeenCheckedError:Expression在检查后已更改。以前的值:“isValid:undefined”。当前值:“isValid:true”

似乎
fixture.detectChanges()
无法与应用程序组件一起正常工作

这是我的规范文件:

import { ComponentFixture, TestBed, async } from '@angular/core/testing';

// Component
import { AppComponent } from './app.component';
import { HeaderComponent } from './components/header/header.component';
import { EmployerInfoComponent } from './components/employer-info/employer-info.component';
import { PayrollInfoComponent } from './components/payroll-info/payroll-info.component';
import { DashboardComponent } from './components/dashboard/dashboard.component';
import { FooterComponent } from './components/footer/footer.component';
import { ProgressJourneyContainerComponent } from './components/progress-journey-container/progress-journey-container.component';
import { StartReportComponent } from './components/start-report/start-report.component';
import { ReportInfoComponent } from './components/report-info/report-info.component';
import { ReportPayrollComponent } from './components/report-payroll/report-payroll.component';

// Module
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { ProgressJourneyModule } from './modules/progress-journey/progress-journey.module';
import { HttpClientModule } from '@angular/common/http';
import { Ng2Webstorage } from 'ngx-webstorage';

// Service
import { EmployerService } from './services/employer/employer.service';
import { PayrollInfoService } from './services/payroll-info/payroll-info.service';
import { DashboardService } from './services/dashboard/dashboard.service';
import { UiConfigService } from './services/ui-config/ui-config.service';
import { MockUiConfigService } from './services/ui-config/mock-uiconfig.service';
import { EmployerCuService } from './services/employer-cu/employer-cu.service';
import { LoggerService } from './services/logger.service';

// Service Mock
import { MockDashboardService } from './services/dashboard/mock-dashboard.service';
import { MockPayrollInfoService } from './services/payroll-info/mock-payrollinfo.service';
import { MockEmployerService, mockEmployer } from './services/employer/mock-employer.service';
import { AppModule } from './app.module';

describe('AppComponent', () => {
  let comp: AppComponent;
  let fixture: ComponentFixture<AppComponent>;

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
        AppModule
      ],
      providers: [
        {
          provide: UiConfigService,
          useClass: MockUiConfigService
        },
        {
          provide: EmployerService,
          useClass: MockEmployerService
        },
        {
          provide: DashboardService,
          useClass: MockDashboardService
        },
        {
          provide: PayrollInfoService,
          useClass: MockPayrollInfoService
        }
      ],
      declarations: []
    })
    .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(AppComponent);
    comp = fixture.componentInstance;
  });

  it('should return employer data', () => {
    // fixture.detectChanges();
    comp.ngOnInit();
    expect(comp.empData).toEqual(mockEmployer);
  });

  it('should render header', () => {
    fixture.detectChanges();
    // expect(fixture.nativeElement.textContent).toContain('Exit');
  });
});
以下是失败的消息:

代码应该非常简单。我目前正在调试测试用例调用“应该呈现头”。所有模拟数据和函数都已明确定义。我不知道为什么会这样失败

请帮忙。还请给我一些关于测试根组件的建议/更正


提前谢谢

我发现了这个问题。它是一个名为
ProgressJourneyContainerComponent
的组件,未正确初始化。它是App/Root组件的子组件

如果我使用
ngOnInit()
而不是
fixture,则第一个测试用例通过。detectChanges()
您的组件中
isValid
在哪里?我在你的代码中找不到它
isValid
不在应用程序组件中。我想我找到了问题所在。请看我的答案。
import { Component, OnInit } from '@angular/core';
import { UiConfigService } from './services/ui-config/ui-config.service';
import { EmployerService } from './services/employer/employer.service';
import { LoggerService } from './services/logger.service';
import { LocalStorageService } from 'ngx-webstorage';
import { LocalDataService } from './services/local-data/local-data.service';
import { EmployerModel } from './models/employer.model';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
  providers: [LocalDataService]
})

export class AppComponent implements OnInit {
  title = 'Reporting annual payroll';
  exitUrl: string;
  empData: EmployerModel = new EmployerModel;
  isStartReport: boolean;

  constructor(
    private uiConfigService: UiConfigService,
    private employerService: EmployerService,
    private loggerService: LoggerService,
    private localStorageService: LocalStorageService,
    private localDataService: LocalDataService
  ) {}

  ngOnInit() {
    this.loggerService.log('started calling getEmployer');

    this.uiConfigService.getUiConfig().subscribe(data => {
      this.exitUrl = data.exitUrl;
    });

    this.employerService.getEmployer().subscribe(data => {
      this.empData = data;
    });
    this.loggerService.log('finished calling getEmployer');

    this.localDataService.getJSON().subscribe(data => {
      this.localStorageService.store('staticData', data);
    });
  }

  startReportChanged(data: boolean) {
    this.isStartReport = data;
  }
}