【发布时间】:2018-06-04 22:12:50
【问题描述】:
我在尝试对 Angular 服务进行单元测试时遇到问题。我想验证该服务是否正确调用了另一个注入其中的服务。
假设我有这个注入 ServiceInjected 的 ServiceToTest:
ServiceToTest .service.ts
@Injectable()
export class ServiceToTest {
constructor(private _si: ServiceInjected) {}
public init() {
this._si.configure();
}
}
ServiceInjected.service.ts
@Injectable()
export class ServiceInjected {
constructor() {}
public configure() {
/*Some actions*/
}
}
有了这些服务,现在我写我的单元测试:
const serviceInjectedStub = {
configure(): void {}
}
describe('ServiceToTest service Test', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [ServiceToTest ,
{ provide: ServiceInjected, useValue: serviceInjectedStub }]
});
});
it('should be initialize the service injected', inject([ServiceToTest],
(tService: ServiceToTest) => {
spyOn(serviceInjectedStub, 'configure');
tService.init();
expect(serviceInjectedStub.configure).toHaveBeenCalled();
}));
我预计我的测试是肯定的,但是我收到以下错误:
预期的间谍配置已被调用。
另一方面,如果我以这种方式将注入的服务设置为公开,它就可以正常工作:
private _si: ServiceInjected by public si: ServiceInjected
【问题讨论】:
-
见github.com/angular/angular/issues/10788。您可以简单地注入真正的服务并对其进行监视。或者根本不使用 DI 并使用
new ServiceToTest(stub)来测试服务。或者按照问题中的说明使用 useFactory。
标签: angular karma-jasmine angular-services injectable spyon