【问题标题】:Angular 7 TestBed.overrideProvider does not work for ActivateRouteAngular 7 TestBed.overrideProvider 不适用于 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的示例代码吗?
  • 我也有同样的问题。你找到答案了吗?

标签: angular jestjs angular7


【解决方案1】:

作为替代解决方案,您可以尝试ng-mocks 及其MockRender

然后,在测试中你可以这样做:

it('test', () => {
  const fixture = MockRender(LoginComponent, null, {
    providers: [
      {
        provide: ActivatedRoute,
        useValue: mockActivatedRoute,
      },
    ],
  });
  // the rest of the test.
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-29
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多