给出下面的示例规范测试
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对象的助手吗?
发布于 2020-05-29 17:51:00
这是正确的,因为有一些内置函数可以触发测试模块的编译。如果您想在需要重置testBed之后更新该值,那么它只能通过访问私有属性才能完成,因此不建议这样做,最好是在首先创建env,然后获取其数据时编写一个适当的测试。
尽管如此,在TestBed.overrideProvider之前,您可以这样做才能使它正常工作。
(getTestBed() as any)._instantiated = false;
(getTestBed() as any)._moduleFactory = undefined;发布于 2020-05-29 15:21:14
看来,TestBed.inject在TestBed.overrideProvider之前运行会导致overrideProvider没有任何效果。overrideProvider函数应该在TestBed.inject()之前使用。显然,这似乎只是configurTestingModule()函数运行后的一个助手方法。因此,上述例子的解决方案是:
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'});
});https://stackoverflow.com/questions/62089324
复制相似问题