Jasmine 单元测试中 MockService 的 UseValue 导致测试失败
UseValue of a MockService in Jasmine unit test causes test fail
我用 karma/jasmine 加载器 运行ning 创建了一个 StackBlitz,所以你可以看到测试 pass/fail。
应用程序正常运行。
我的测试应该没问题并且会通过,但是我在使用模拟服务而不是 createspyobject
上的正确服务时遇到了一个奇怪的错误。
component.ts
getReportFunc(): void {
this.reportService.getReport(this.urn).subscribe(selectedReport => {
this.model = selectedReport;
});
}
简单调用服务以获取“getReport”。我将添加一个测试来检查报告是否已被调用。但是不能因为这个问题。
spec.ts
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 }
使用 ReportService
会 运行 没问题,但这意味着我不能 运行 我的测试之一。我想创建一个间谍对象 mockReportService = jasmine.createSpyObj(['getReport']);
.
您将在 StackBlitz 中看到的错误是 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();
});
- 不要使用间谍
当然,间谍很简洁,但只有当您想在不同的单元测试期间更改 returned 值时它们才有用。如果您只需要始终 return 一个值,无论哪个,您都可以选择像这样的硬编码对象:
const mockReportService = {
getReport: () => of({})
}
providers: [
{ provide: ReportService, useValue: mockReportService },
我用 karma/jasmine 加载器 运行ning 创建了一个 StackBlitz,所以你可以看到测试 pass/fail。
应用程序正常运行。
我的测试应该没问题并且会通过,但是我在使用模拟服务而不是 createspyobject
上的正确服务时遇到了一个奇怪的错误。
component.ts
getReportFunc(): void {
this.reportService.getReport(this.urn).subscribe(selectedReport => {
this.model = selectedReport;
});
}
简单调用服务以获取“getReport”。我将添加一个测试来检查报告是否已被调用。但是不能因为这个问题。
spec.ts
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 }
使用 ReportService
会 运行 没问题,但这意味着我不能 运行 我的测试之一。我想创建一个间谍对象 mockReportService = jasmine.createSpyObj(['getReport']);
.
您将在 StackBlitz 中看到的错误是 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();
});
- 不要使用间谍
当然,间谍很简洁,但只有当您想在不同的单元测试期间更改 returned 值时它们才有用。如果您只需要始终 return 一个值,无论哪个,您都可以选择像这样的硬编码对象:
const mockReportService = {
getReport: () => of({})
}
providers: [
{ provide: ReportService, useValue: mockReportService },