【发布时间】:2019-04-26 23:18:25
【问题描述】:
我正在使用带有 Jest 的 Angular 7,并且正在模拟组件的提供程序。很多时候,我需要在编译 TestBed 之后更改注入到组件中的内容,并且使用这段代码我没有遇到任何问题:
TestBed.configureTestingModule({...});
await TestBed.compileComponents();
... some code
TestBed.overrideProvider(SecurityService, {useValue: mockSecurityService});
fixture = TestBed.createComponent(LoginComponent);
fixture.detectChanges()
当我这样做时,新的 mockSecurityService 将包含在我的组件中,正如我所期望的那样。但是......这真的很奇怪......无论我做什么,这个方法都不适用于ActivatedRoute。因此,如果我更改 mockActivatedRoute 并添加这行代码:
TestBed.overrideProvider(ActivatedRoute, {useValue: mockActivatedRoute});
TestBed.overrideProvider(SecurityService, {useValue: mockSecurityService});
fixture = TestBed.createComponent(LoginComponent);
fixture.detectChanges()
组件使用它获得的第一个 mockActivatedRoute 类进行实例化,并且无论随后调用多少次 overrideProvider,第一个对象都会被搁置。
这真的很奇怪,因为完全相同的代码路径适用于我的 mockSecurityService 以及 Angular Router 服务的模拟。是否有关于 ActivatedRoute 类导致 TestBed 忽略覆盖的内容?我单步执行了代码,看不出有什么区别;据我所知,overrideProviderMap 正在获取 ActivatedRoute 覆盖,但组件实例化仍然忽略它。
【问题讨论】:
-
如果您链接到同一个 TestBed 调用,问题是否仍然存在? Testbed.overrideProvider(ActivatedRoute, {useValue: mockActivatedRoute}).overrideProvider(SecurityService, {useValue: mockSecurityService});
-
您可以在 TestBed.configureTestingModule 部分覆盖提供者。
-
可以分享
ActivatedRoute的示例代码吗? -
我也有同样的问题。你找到答案了吗?