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 6 / 7“依赖的结果是一个表达式”

已安装 Angular 版本 ~7.1.0 想要安装版本 4

升级到 9.0 和 angular 7 后修复 angular-redux/store

Angular 7 - 未注册的服务人员

Angular JS - 7 - Angular JS 常用指令2

Angular 7 - ControlValueAccessor - 修剪绑定到表单的输入值