【问题标题】:ngx-translate: Translate string in Unit Testingngx-translate:在单元测试中翻译字符串
【发布时间】:2018-08-16 18:31:56
【问题描述】:

如果是静态测试,我可以获取该值,但每当我尝试获取转换后的值(使用 ngx-translate)时,它都是空的。

<div id="header-title">
    <h1>{{ 'MENU_TITLE' | translate | uppercase }}</h1>
</div>

这可行并返回Test

<div id="header-title">
    <h1>Test</h1>
</div>

spec.ts

it('should translate a string using the key value', () => {
    fixture = TestBed.createComponent(NavComponent);
    const title = fixture.nativeElement;
    console.log(title.querySelector('#header-title h1').innerHTML);
});

导入翻译模块

beforeEach(async(() => {
        TestBed.configureTestingModule({
            imports: [RouterTestingModule,
                TranslateModule.forRoot({
                    loader: {
                        provide: TranslateLoader,
                        useFactory: HttpLoaderFactory,
                        deps: [HttpClient]
                    }
                }),
                HttpClientModule
            ],
            declarations: [NavComponent]
        }).compileComponents();

        injector = getTestBed();
        translate = injector.get(TranslateService);
    }));

-----FIXED----- 但不确定这是否是正确的做法

let fixture: ComponentFixture<NavComponent>;

it('should translate a string using the key value', () => {
    fixture.detectChanges() // fixture = TestBed.createComponent(NavComponent);
    const title = fixture.nativeElement;
    console.log(title.querySelector('#header-title h1').innerHTML);
});

【问题讨论】:

  • 添加完整示例!

标签: angular unit-testing typescript karma-jasmine ngx-translate


【解决方案1】:

不知道为什么要在单元测试中测试它。

它不起作用的原因是翻译管道与仍在检索值的日志发生异步。

我假设您已经在 TestBed 中提供了 TranslateModule。

现在,我不确定这是否 100% 有效,所以也许你可以试一试。不过理论上,你可以尝试使用 async 和 whenStable():

  it(
    'should translate a string using the key value',
    async(() => {
      fixture = TestBed.createComponent(NavComponent);
      const title = fixture.nativeElement;

      fixture.whenStable().then(() => {
        fixture.detectChanges();
        console.log(title.querySelector('#header-title h1').innerHTML);
      });
    })
  );

祝你好运:)!

【讨论】:

  • 谢谢,没用。但是,当我在我的代码中删除 fixture = TestBed.createComponent(NavComponent); 并将其替换为 fixture.detectChanges();.. 这返回的 'MENU_TITLE' 仍然不是我想要的,因为我需要翻译,但至少它不再是空的了。不确定我的解决方法是否是好方法
  • 我能看看你们是如何提供翻译模块的吗?您必须提供加载程序,以便它知道从哪里获取翻译(与您在 app.module.ts 中提供的方式相同。有关更多信息:github.com/ngx-translate/core/issues/636
  • 在问题中添加
【解决方案2】:

找到了翻译Unit Testing中的密钥的解决方案

首先您检查您的textContent 是否等于翻译键。然后为该键设置翻译并再次检查它是否已翻译:

it('should translate a string using the key value', async(() => {
    fixture.detectChanges();
    const compiled = fixture.debugElement.nativeElement;
    expect(compiled.querySelector('#header-title h1').textContent).toEqual('MENU_TITLE');
    translate.setTranslation('en', { MENU_TITLE: 'reporting' });
    translate.use('en');
    fixture.detectChanges();
    expect(compiled.querySelector('#header-title h1').textContent).toEqual('REPORTING');
}));

【讨论】:

  • translate.setTranslation 的导入是什么?
猜你喜欢
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 2019-02-04
  • 2021-04-27
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多