组件中的模拟服务 - 模拟被忽略

Mocking service in a component - mock ignored

这次我尝试模拟一个服务(执行 http 调用)来测试组件。

@Component({
  selector: 'ub-funding-plan',
  templateUrl: './funding-plan.component.html',
  styleUrls: ['./funding-plan.component.css'],
  providers: [FundingPlanService]
})
export class FundingPlanComponent implements OnInit {
  constructor(private fundingPlanService: FundingPlanService) {
  }

  ngOnInit() {
    this.reloadFundingPlans();
  }

  reloadFundingPlans() {
    this.fundingPlanService.getFundingPlans().subscribe((fundingPlans: FundingPlan[]) => {
      this.fundingPlans = fundingPlans;
    }, (error) => {
      console.log(error);
    });
  }
}

documentation(版本 2.0.0)说明您应该模拟该服务。使用相同的 TestBed 配置:

describe('Component: FundingPlan', () => {
  class FundingPlanServiceMock {
    getFundingPlans(): Observable<FundingPlan> { return Observable.of(testFundingPlans) }
  }

  beforeEach(() => {
    TestBed.configureTestingModule({
      declarations: [FundingPlanComponent],
      providers: [
        { provide: FundingPlanService, useClass: FundingPlanServiceMock },
      ]
    });

    fixture = TestBed.createComponent(FundingPlanComponent);
    component = fixture.componentInstance;
  });

  fit('should display a title', () => {
    fixture.detectChanges();
    expect(titleElement.nativeElement.textContent).toContain('Funding Plans');
  });

});

当我 运行 测试时,我得到:

Error: No provider for AuthHttp!

实际服务确实使用了它,但模拟服务没有使用它。所以出于某种原因,模拟没有被注入或使用。

有什么建议吗?谢谢!

因为

@Component({
  providers: [FundingPlanService] <===
})

@Component.providers 优先于任何全局提供程序,因为使用 @Component.providers 使提供程序仅作用于组件。在测试中,Angular 在模块范围内创建模拟服务,在组件范围内创建原始服务。

为了解决这个问题,Angular提供了TestBed.overrideComponent方法,我们可以在组件级别覆盖模板和提供者等内容。

TestBed.configureTestingModule({
  declarations: [FundingPlanComponent]
});
TestBed.overrideComponent(FundingPlanComponent, {
  set: {
    providers: [
      { provide: FundingPlanService, useClass: FundingPlanServiceMock },
    ]
  }
})

另请参阅: