Angular 7 TestBed.overrideProvider 不适用于 ActivateRoute
Posted
技术标签:
【中文标题】Angular 7 TestBed.overrideProvider 不适用于 ActivateRoute【英文标题】:Angular 7 TestBed.overrideProvider does not work for ActivateRoute 【发布时间】: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
的示例代码吗?
我也有同样的问题。你找到答案了吗?
***.com/a/59160364/472193 -- 回答
【参考方案1】:
作为替代解决方案,您可以尝试ng-mocks 及其MockRender。
然后,在测试中你可以这样做:
it('test', () =>
const fixture = MockRender(LoginComponent, null,
providers: [
provide: ActivatedRoute,
useValue: mockActivatedRoute,
,
],
);
// the rest of the test.
);
【讨论】:
以上是关于Angular 7 TestBed.overrideProvider 不适用于 ActivateRoute的主要内容,如果未能解决你的问题,请参考以下文章
已安装 Angular 版本 ~7.1.0 想要安装版本 4
升级到 9.0 和 angular 7 后修复 angular-redux/store