我正在尝试使用TestBed为我的服务设置测试。该服务具有其他服务的某些依赖性。我已经为那些依赖项创建了.stub文件并导出了它们。问题是,当我尝试在测试中使用这些存根时,似乎测试方法仍使用真实服务而不是测试。这是我的设置(假名称仅用于此线程):
describe('ServiceToTest', () => {
let stubbedService: ServiceDependency1;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [],
providers: [
ServiceToTest,
{ provide: ServiceDependency1, useClass: ServiceDependency1Stub },
{ provide: ServiceDependency2, useClass: ServiceDependency2Stub }
]
});
stubbedService = TestBed.inject(ServiceDependency1);
});
it('description', fakeAsync(() => {
// Error appears here when trying to use the BehaviorSubject on the mock:
// Property 'behaviorSubjectTest' does not exist on type
'ServiceDependency1'
stubbedService.behaviorSubjectTest.next(new Test());
... more logic
}));
});
我理解该错误,这是因为behaviorSubjectTest
属性位于存根上,而不是真正的服务上。但是当我在提供程序中将其列为useClass
时,为什么不使用存根服务呢?
我在做什么错?当我看到serviceDependency1Stub
上可用的内容时,我看到的是真实服务上的所有方法和属性,而不是存根。这是在更新到Angular 9之后发生的。之前我们使用.get
方法,然后它起作用了。然后按如下所示进行设置:
describe('ServiceToTest', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [],
providers: [
ServiceToTest,
{ provide: ServiceDependency1, useClass: ServiceDependency1Stub },
{ provide: ServiceDependency2, useClass: ServiceDependency2Stub }
]
});
});
it('description', fakeAsync(() => {
const stubbedService = TestBed.get(ServiceDependency1);
stubbedService.behaviorSubjectTest.next(new Test());
... more logic
}));
});
这是.stub文件:
export class ServiceDependency1Stub {
public behaviorSubjectTest = new BehaviorSubject<Test>(null);
}
我猜从一开始的设置是错误的,但是在更改为.inject
之后现在还没有公开?
我查看了文档,但是找不到有关依赖项的测试服务的良好示例。如果有人能帮助我并指出正确的方向,我将不胜感激。
谢谢。