无法弄清楚为啥 res.json() 没有在 Unit Test Coverage, Angular 中命中

Posted

技术标签:

【中文标题】无法弄清楚为啥 res.json() 没有在 Unit Test Coverage, Angular 中命中【英文标题】:Can't figure out why res.json() is not hit in Unit Test Coverage, Angular无法弄清楚为什么 res.json() 没有在 Unit Test Coverage, Angular 中命中 【发布时间】:2017-10-01 15:38:39 【问题描述】:

所以我有一个由 karma-coverage-instanbul-reporter 跟踪的单元测试覆盖率,但是当我查看覆盖率报告时:

.map(res => res.json())

我的所有 Providers 中的一部分从未在测试中命中。但我确实对这些 Providers 进行了测试,并且正在验证我是否收到了响应。

这是我正在测试的函数的示例:

public getCampaigns(): Observable<CampaignsResponse> 
  return this.http.get(this.campaignsUrl).map(res => res.json());

这里是这个函数的测试:

describe("getCampaigns", () => 
  it("should return an Observable<CampaignsResponse>",
    inject([CampaignsService, MockBackend], (service: CampaignsService, mockBackend: MockBackend) => 
      // arrange
      mockBackend.connections.subscribe((connection: any) => 
        connection.mockBackend(new Response(new ResponseOptions(
          body: JSON.stringify(mockCampaigns),
        )));
      );

      // act
      service.getCampaigns().subscribe((campaigns) => 
        // assert
        expect(campaigns.campaigns.length).toEqual(1);
   expect(campaigns.campaigns[0].id).toEqual(mockCampaigns.campaigns[0].id);
      expect(campaigns.campaigns[0].channelID).toEqual(mockCampaigns.campaigns[0].channelID);
      expect(campaigns.campaigns[0].name).toEqual(mockCampaigns.campaigns[0].name);
      expect(campaigns.campaigns[0].active).toEqual(mockCampaigns.campaigns[0].active);
      expect(campaigns.campaigns[0].createdAt).toEqual(mockCampaigns.campaigns[0].createdAt);
      expect(campaigns.campaigns[0].updatedAt).toEqual(mockCampaigns.campaigns[0].updatedAt);
    );
));

);

但根据我的测试覆盖率 res.json() 永远不会在 map 函数中被命中。

有没有人知道为什么会这样?覆盖率报告是否可能是错误的,或者是否将代码错误地映射回 TypeScript?

【问题讨论】:

【参考方案1】:

您的connection 具有MockConnection 类型而不是any,并且MockConnection 没有mockBackend 属性。相反,它有一个mockRespond。 https://angular.io/docs/ts/latest/api/http/testing/index/MockConnection-class.html

尝试像这样修改测试:

// arrange
mockBackend.connections.subscribe((connection: MockConnection) => 
  connection.mockRespond(new Response(new ResponseOptions(
    body: JSON.stringify(mockCampaigns),
  )));
);

【讨论】:

好吧,当我将其保留为mockBackend 时,它确实正确执行了测试,所以我认为connection 变量确实具有mockBackend 属性。但是,当我尝试使用mockRespond 时,我仍然看到res.json() 没有受到打击的相同代码覆盖率分析。

以上是关于无法弄清楚为啥 res.json() 没有在 Unit Test Coverage, Angular 中命中的主要内容,如果未能解决你的问题,请参考以下文章

我无法弄清楚为啥我的数组列表没有使用我所说的新值进行更新

无法弄清楚为啥触发器无效?

无法弄清楚为啥页面在底部加载? Angular UI-Router 自动滚动问题

无法弄清楚为啥我的提交按钮不会提交

无法弄清楚为啥“悬停”不起作用

使用 mypy 进行类型检查,我无法弄清楚为啥会发生此错误 [关闭]