gpt4 book ai didi

Angular 7 TestBed.overrideProvider 不适用于 ActivateRoute

转载 作者:行者123 更新时间:2023-12-04 11:34:13 26 4
gpt4 key购买 nike

我正在使用带有 Jest 的 Angular 7 并且正在模拟组件的提供者。很多时候我需要更改在 TestBed 之后注入(inject)到组件中的内容。已编译,并且使用此代码执行此操作没有任何问题:

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 覆盖,但组件实例化仍然忽略它。

最佳答案

作为替代解决方案,您可以尝试 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,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53462019/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com