无法弄清楚为啥 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 中命中的主要内容,如果未能解决你的问题,请参考以下文章