Angular2-测试注入的私有服务方法是否已被调用

Angular2-测试注入的私有服务方法是否已被调用,angular,jasmine,angular2-testing,Angular,Jasmine,Angular2 Testing,首先,我知道我不应该测试私有方法,但是我觉得有时我应该测试私有方法是否基于某种逻辑被调用 我正在围绕angular 2 http服务构建一个包装器服务,这样我就可以在不必将代码写入每个http请求的情况下进行全局错误处理 该类的一个小样本如下所示: export class ApiService { constructor(private http: Http, private error: Error, private apiConfig: ApiConfig) {} public

首先,我知道我不应该测试私有方法,但是我觉得有时我应该测试私有方法是否基于某种逻辑被调用

我正在围绕angular 2 http服务构建一个包装器服务,这样我就可以在不必将代码写入每个http请求的情况下进行全局错误处理

该类的一个小样本如下所示:

export class ApiService {
  constructor(private http: Http, private error: Error, private apiConfig: ApiConfig) {}

  public get(url: string, options: RequestOptionsArgs={}): Observable<any> {
   return this.http.get(url, options).catch((error: any) => {
     this.error.dispatch(error);
     return error;
   });
  }
}
{ provide: Error, useClass: FakeError }
但是ApiService类的蓝图保持不变,现在的FakeError服务仍然是私有的。在Java中,您可以自己创建实例并将其注入,因为您拥有它,所以您可以访问它。我想我正试图在jasmine/typescript/angular2中找到一种方法来做到这一点,这是有帮助的地方。如果真实的
错误
可以在没有DI的情况下实例化,您可以这样做

let error;
beforeEach(()=>{
   error = new Error();
   spyOn(error, 'dispatch');

  TestBed.configureTestingModule({
    providers: [
      { provide: Error, useValue: error }
    ]
  });
});

it('', ()=> {
  expect(error.dispatch).toHaveBeenCalled();
});
或者您可以忘记
错误
类并提供模拟

class FakeError {
  dispatch = jasmine.createSpy('dispatch');
}

就像上面那样使用它。不过,您不需要像上面那样调用
spyOn
。这里,
dispatch
已经是一个间谍。

你可以间谍一个私有方法。@estus这可能是真的,但我无法测试它,因为我使用的是typescript,如果我尝试这样断言:expect(service.error.dispatch)。to。。。然后打字脚本linter爆炸了,因为我无法访问service.error,因为它是私有的。太棒了,工作得很好,谢谢。有一个问题,为什么我必须把间谍放在beforeach而不是it区。我试过了,但没用,我很惊讶。有什么想法吗?