gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:57:44 25 4
gpt4 key购买 nike

这次我尝试模拟一个服务(执行 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!

这确实被实际服务使用,但不被模拟。所以出于某种原因,模拟没有被注入(inject)或使用。

有什么建议吗?谢谢!

最佳答案

因为

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

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

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

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

另见:

关于angular - 组件中的模拟服务 - 模拟被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40021366/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com