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 个选择:

  1. 使用 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();
});
  1. 不要使用间谍

当然,间谍很简洁,但只有当您想在不同的单元测试期间更改 returned 值时它们才有用。如果您只需要始终 return 一个值,无论哪个,您都可以选择像这样的硬编码对象:

  const mockReportService = {
    getReport: () => of({})
  }

  providers: [
    { provide: ReportService, useValue: mockReportService },