首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果以前运行过TestBed.OverrideProvider()或TestBed.get() (已弃用),则TestBed.inject()不能工作

如果以前运行过TestBed.OverrideProvider()或TestBed.get() (已弃用),则TestBed.inject()不能工作
EN

Stack Overflow用户
提问于 2020-05-29 15:21:14
回答 2查看 2.6K关注 0票数 0

给出下面的示例规范测试

代码语言:javascript
复制
beforeEach(function () {
        TestBed.configureTestingModule({
            providers: [
                { provide: TranslateService, useClass: TranslateServiceMock },
                { provide: StoreService, useClass: StoreServiceMock },
                {
                    provide: GLOBAL_CONFIG_TOKEN,
                    useValue: { default: true }
                }
            ],
        });
        let config = TestBed.inject(GLOBAL_CONFIG_TOKEN);
});

it('should override provider otherwise what is the point? :)', () => {
  let config = TestBed.overrideProvider(GLOBAL_CONFIG_TOKEN, { useValue: { default: false, random: 'damn' } });
expect(config).toEqual({default: false, random: 'damn'});
});

问题是,测试失败了,因为默认总是,真正的,而随机不是配置的属性。这意味着,在测试模块的配置过程中,配置仍然具有默认值,而且提供程序还没有被覆盖。

知道为什么吗?overrideProvider方法只是更新最初在configureTestingModule上传递的moduleRef对象的助手吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-29 17:51:00

这是正确的,因为有一些内置函数可以触发测试模块的编译。如果您想在需要重置testBed之后更新该值,那么它只能通过访问私有属性才能完成,因此不建议这样做,最好是在首先创建env,然后获取其数据时编写一个适当的测试。

尽管如此,在TestBed.overrideProvider之前,您可以这样做才能使它正常工作。

代码语言:javascript
复制
  (getTestBed() as any)._instantiated = false;
  (getTestBed() as any)._moduleFactory = undefined;
票数 1
EN

Stack Overflow用户

发布于 2020-05-29 15:21:14

看来,TestBed.injectTestBed.overrideProvider之前运行会导致overrideProvider没有任何效果。overrideProvider函数应该在TestBed.inject()之前使用。显然,这似乎只是configurTestingModule()函数运行后的一个助手方法。因此,上述例子的解决方案是:

代码语言:javascript
复制
beforeEach(function () {
        TestBed.configureTestingModule({
            providers: [
                { provide: TranslateService, useClass: TranslateServiceMock },
                { provide: StoreService, useClass: StoreServiceMock },
                {
                    provide: GLOBAL_CONFIG_TOKEN,
                    useValue: { default: true }
                }
            ],
        });
});

it('should override provider otherwise what is the point? :)', () => {
  TestBed.overrideProvider(GLOBAL_CONFIG_TOKEN, { useValue: { default: false, random: 'damn' } });

  let config = TestBed.inject(GLOBAL_CONFIG_TOKEN);
  expect(config).toEqual({default: false, random: 'damn'});
});
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62089324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档