单独测试具有依赖性的角度服务

时间:2017-08-24 14:14:52

标签: angular unit-testing jasmine

我正在测试一个依赖于Http服务的角度4服务。 testing guide建议使用隔离的单元测试,其中使用new关键字创建服务实例:

beforeEach(() => { service = new FancyService(); });

但是当FancyService使用Http服务时,我收到错误

  

提供的参数与呼叫目标的任何签名都不匹配。

这是有道理的,因为Http服务在FancyService构造函数中。所以我添加了一个新的Http实例,如下所示,但我得到了同样的错误。

beforeEach(() => { service = new FancyService(new Http())})

如何在测试中提供我的服务?

1 个答案:

答案 0 :(得分:1)

您需要模拟依赖项 - 使用具有必要方法的存根服务。

import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';
import 'rxjs/add/operator/take';

class FancyService {
  constructor(private http: HttpClient) {}

  getFancy(): Observable<any> {
    return this.http.get('url');
  }
}

describe('FancyService', () => {
  let service: FancyService;

  it('can get fancy', () => {
    const fakeHttpClient = {
      get: () => {}
    };
    spyOn(fakeHttpClient, 'get').and.returnValue(Observable.of('data'));

    service = new FancyService(<any>fakeHttpClient);

    service.getFancy().take(1).subscribe(
      (result: any) => {
        expect(result).toBe('data');
      }
    );
    expect(fakeHttpClient.get).toHaveBeenCalledTimes(1);
    expect(fakeHttpClient.get).toHaveBeenCalledWith('url');
  });
});