我有这个组件,它自己提供服务
@Component({
selector: 'my-component',
providers: [MyService],
...
})
export class MyComponent {
constructor(@Self() private service: MyService) {}
...
}
在单元测试期间我注意到以下内容
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [MyComponent],
providers: [MyService],
}).compileComponents();
service = TestBed.inject(MyService);
});
service
与我的组件内的服务不是同一个实例。我想这是有道理的,但我找不到解决方案,因为对于我的测试,我需要访问组件内的该服务。有什么建议吗?
在这种情况下,自备并不是去那里的正确方式。但如果你绝对必须这样做,那么你可以像这样获得访问权限:
TestBed.configureTestingModule({
declarations: [MyComponent],
}).compileComponents();
const fixture = TestBed.createComponent(MyComponent);
service = (fixture.componentInstance as any).service;
请注意,
private
仅是编译时的,因此在运行时访问它并非不可能。不过,我仍然建议在模块级别提供服务。
正如@johnrsharpe 在上面的评论中提到的,它的实现细节所以你不必处理它。这就是我所做的,但我只是找到了一种方法。我不再需要它,但出于教育目的,我无论如何都会展示它:
let myService: MyService;
beforeEach(() => {
myService = { ... };
TestBed.configureTestingModule({
declarations: [MyComponent],
providers: [MyService],
}).overrideComponent(MyComponent, {
set: {
providers: [
provide: MyService, useValue: myService
]
}
});
}).compileComponents();
现在您可以使用
myService
进行嘲笑和间谍活动!
可以使用以下代码访问组件服务提供者实例:
let service: MyService;
let component: MyComponent;
let fixture: ComponentFixture<MyComponent>;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [MyComponent],
providers: [MyService],
}).compileComponents();
});
beforeEach(() => {
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
service = fixture.componentRef.injector.get(MyService);
});