gpt4 book ai didi

angular - 覆盖特定测试的 TestBed 提供程序

转载 作者:行者123 更新时间:2023-12-03 20:13:53 26 4
gpt4 key购买 nike

我有一个组件,它有两个依赖项:一个是 LOCALE_ID在 Angular 中全局定义,另一种是语言,在组件中定义为 { provide: LANGUAGE_TOKEN, useValue: navigator.language }
对于测试,我都在 TestBed 中为所有测试覆盖它们,因此测试不会从 Chrome 浏览器中注入(inject)任何东西来进行业力测试,并且测试不会根据测试环境产生不同的结果:

TestBed.configureTestingModule({
declarations: [
MyComponent, RouterStubComponent,
],
imports: [
MatToolbarModule, RouterTestingModule, MatIconModule, MatButtonModule,
],
providers: [
{provide: LOCALE_ID, useValue: 'en-US' },
]
}).compileComponents();

TestBed.overrideProvider(LOCATION_TOKEN, {useValue: locationStub});
TestBed.overrideProvider(LANGUAGE_TOKEN, {useValue: 'en-US' });

现在我在组件中有一些依赖于语言环境和浏览器语言的逻辑,所以我需要模拟它们。 mock LANGUAGE_TOKEN super 简单,几乎没有不便:

 it('should redirect to spanish when in spanish browser', () => {
TestBed.overrideProvider(LANGUAGE_TOKEN, {useValue: 'es'});
fixture = TestBed.createComponent(MyComponent);
component = fixture.componentInstance;
fixture.detectChanges();

expect(hrefSpy.calls.count()).toBe(1);
expect(hrefSpy.calls.argsFor(0)[0]).toEqual(environment.spanUrl);
});

但是覆盖 LOCALE_ID使用相同的代码不起作用。

  it('should ...', () => {
TestBed.overrideProvider(LOCALE_ID, {useValue: 'es-ES'});
console.log(TestBed.get(LOCALE_ID)); // en-US!!!!
fixture = TestBed.createComponent(MamanComponent);
component = fixture.componentInstance;
fixture.detectChanges();

expect(hrefSpy.calls.count()).toBe(1); //FAIL
expect(hrefSpy.calls.argsFor(0)[0]).toEqual(environment.engUrl);//FAIL
});

我无法在 this question 中找到有效的答案任何一个。

最佳答案

这是因为只要您调用 compileComponents ,提供者被卡住并且不会被覆盖。
要么删除 LOCALE_ID来自 providers这样它的值(value)就不会被卡住。 (但请确保在 创建组件实例 之前使用 overrideProviders 提供它):

TestBed.configureTestingModule({
declarations: [
MyComponent, RouterStubComponent,
],
imports: [
MatToolbarModule, RouterTestingModule, MatIconModule, MatButtonModule,
],
providers: [
--> remove
]
}).compileComponents();

TestBed.overrideProvider(LOCALE_ID, {useValue: 'es-ES'});
//Add it before creating component, to have a default value in each test, add it in a beforeEach block.
或者您可以调用 compileComponents在每个测试中创建组件实例之前:
TestBed.configureTestingModule({
declarations: [
MyComponent, RouterStubComponent,
],
imports: [
MatToolbarModule, RouterTestingModule, MatIconModule, MatButtonModule,
],
providers: [
{provide: LOCALE_ID, useValue: 'en-US' },
]
});
--> remove compileComponents
然后在每次测试中:
it('should ...', () => {
TestBed.overrideProvider(LOCALE_ID, {useValue: 'es-ES'});
// Add here
TestBed.compileComponents();
fixture = TestBed.createComponent(MamanComponent);
component = fixture.componentInstance;
fixture.detectChanges();

expect(hrefSpy.calls.count()).toBe(1); //FAIL
expect(hrefSpy.calls.argsFor(0)[0]).toEqual(environment.engUrl);//FAIL
});

关于angular - 覆盖特定测试的 TestBed 提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58630884/

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