代码覆盖率无法识别我的间谍功能

时间:2018-12-26 21:25:11

标签: angular karma-jasmine istanbul

我在服务中拥有此功能。

  addTeamMember(data): Observable<any> {
   if (data && typeof data === 'object') {
    return this.http.post<any>(`${this.baseUrl}/members`, 
     JSON.stringify(data), { headers: this.headers });
   } else {
    return null;
   }

}

我用以下方法对此进行测试:

it('should be create a new member', () => {
const data = {
  name: 'Rodolfo Lenin',
  lastName: 'xxxx xxxx',
  rol: 'Front-End',
  gender: 'male'
};
spy = spyOn(teamService, 'addTeamMember');
spy.and.callThrough();
spy.and.callFake(function() {});
spy.and.returnValue(data);
response = teamService.addTeamMember(of(data));
console.log(response, data, 'werr');
// expect(teamService.addTeamMember).toHaveBeenCalled();
expect(data).toEqual(jasmine.any(Object));
expect(response).toEqual(data); });

我不知道为什么测试范围无法识别此呼叫 enter image description here

1 个答案:

答案 0 :(得分:0)

您正在拔出teamMember.addTeamMember,这就是为什么它永远不会被调用的原因。您可以使用console.log语句进行验证(或仅信任您的代码覆盖率工具;)

您应该将http.post存根,以便对addTeamMember进行实际测试。

话虽如此,您的测试没有意义:

  • 您正在向对象传递可观察对象
  • 您正在伪装返回对象而不是可观察对象的方法

可能的解决方案

 it('creates a new member', () => {

    const data = {
      name: 'Rodolfo Lenin',
      lastName: 'xxxx xxxx',
      rol: 'Front-End',
      gender: 'male'
    };

    spyOn(httpService, 'post').and.returnValue(of(data));

    teamService.addTeamMember(data).subscribe((responseData) => {
        expect(responseData).toEqual(data);
    });
 });

请注意,对于服务返回null的情况,您应该编写另一个测试。但是,由于传入了无效参数而返回null通常被认为是反模式。参见Is returning null bad design?

此外,Angular https://angular.io/guide/http#testing-http-requests

建议使用另一种方法

这是关于检查参数https://blogs.msdn.microsoft.com/oldnewthing/20091210-00/?p=15713

的有趣对话