Angular2-测试注入的私有服务方法是否已被调用
首先,我知道我不应该测试私有方法,但是我觉得有时我应该测试私有方法是否基于某种逻辑被调用 我正在围绕angular 2 http服务构建一个包装器服务,这样我就可以在不必将代码写入每个http请求的情况下进行全局错误处理 该类的一个小样本如下所示: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
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区。我试过了,但没用,我很惊讶。有什么想法吗?