我已经创建了一个运行karma / jasmine加载程序的StackBlitz,这样您就可以看到测试通过/失败。
该应用程序正在正常工作。
我的测试应该可以并且可以通过,但是我在使用模拟服务而不是正确的服务时遇到了一个奇怪的错误createspyobject
。
component.ts
getReportFunc(): void {
this.reportService.getReport(this.urn).subscribe(selectedReport => {
this.model = selectedReport;
});
}
简单调用服务即可获取“ getReport”。我将添加一个测试以检查报告是否已被调用。但是因为这个问题不能。
规格
describe("SearchComponent", () => {
let component: SearchComponent;
let fixture: ComponentFixture<SearchComponent>;
let mockReportService;
beforeEach(async(() => {
mockReportService = jasmine.createSpyObj(['getReport']);
TestBed.configureTestingModule({
declarations: [SearchComponent],
providers: [
//ReportService,
{ provide: ReportService, useValue: mockReportService },
...
问题在于{ provide: ReportService, useValue: mockReportService }
使用justReportService
可以正常运行,但这意味着我无法运行我的测试之一。我想创建一个间谍对象mockReportService = jasmine.createSpyObj(['getReport']);
。
您将在StackBlitz中看到的错误是that TypeError: Cannot read property 'subscribe' of undefined
。
如果有人可以帮助我使它与模拟服务一起运行,以便我可以测试getReport订阅功能,我将不胜感激。
问题来自滥用jasmine.createSpyObj
您有2个选择:
jasmine.createSpyObj
但以正确的方式:// Note the first arg, you were missing it
mockReportService = jasmine.createSpyObj(ReportService, ['getReport']);
// Then, explain what to do with it :
beforeEach(() => {
[...]
// When called, make it return an Observable so that the call to subscribe() succeeds
mockReportService.getReport.and.returnValue(of({}));
fixture.detectChanges();
});
当然,间谍很整洁,但是仅当您想在不同的单元测试期间更改返回的值时,它们才有用。如果您只需要始终返回一个值,那么无论如何,您都可以选择像这样的硬编码对象:
const mockReportService = {
getReport: () => of({})
}
providers: [
{ provide: ReportService, useValue: mockReportService },
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句