ngx-translate 如何测试组件

Ser*_*gey 9 testing internationalization typescript ngx-translate angular

我有一个使用这个库的应用程序。我如何用它测试组件?我不想测试库。我只需要开始测试我的组件,而不会出现关于 TranslateModule 然后 TranslateService 然后 TranslateStore 的多个错误......直到我在编译时出现错误。

有没有一种简单的方法可以使用这种依赖来运行我的测试?

再一次,我不想测试这个库(检查字符串是否被翻译)我需要对依赖这个库的组件运行测试。

wut*_*aer 12

对我来说,ngx-translate-testing 运行良好 https://www.npmjs.com/package/ngx-translate-testing

第一的

import { TranslateTestingModule } from 'ngx-translate-testing';
Run Code Online (Sandbox Code Playgroud)

然后

  imports: [
    ...
    TranslateTestingModule.withTranslations({ en: require('src/assets/i18n/en.json'), de: require('src/assets/i18n/de.json') })
  ], 
Run Code Online (Sandbox Code Playgroud)

然后测试

  it('should render german title', inject([TranslateService], (translateService: TranslateService) => {
    translateService.setDefaultLang('de');
    const fixture = TestBed.createComponent(AppComponent);
    fixture.detectChanges();
    const compiled = fixture.debugElement.nativeElement;
    expect(compiled.querySelector('.title').textContent).toContain('GERMANTITLE');
  }));
Run Code Online (Sandbox Code Playgroud)


Cha*_*eur 9

如果您不一定需要翻译密钥,您可以TranslateModule像这样在测试中导入:

beforeEach(async(() => {
  TestBed.configureTestingModule({
    declarations: [
      ...
    ],
    imports: [
      TranslateModule.forRoot(),
    ],
    providers: [
      ...
    ]
  })
  .compileComponents();
}));
Run Code Online (Sandbox Code Playgroud)

它只会显示翻译键


Kat*_*tja 9

(使用 Angular 8.1.0 和 ngx-translate 11.0.1 测试)

A)如果您在组件中使用翻译管道,请创建一个TranslateMockPipe并将其添加到declarations您的规范数组中(如本期建议)。

翻译-mock.pipe.ts

import {Pipe, PipeTransform} from '@angular/core';


@Pipe({
  name: "translate"
})
export class TranslateMockPipe implements PipeTransform {
  public name: string = "translate";

  public transform(query: string, ...args: any[]): any {
    return query;
  }
}
Run Code Online (Sandbox Code Playgroud)

你的component.spec.ts

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ YourComponent, TranslateMockPipe ],
      imports: [
        ...
      ]
    })
    .compileComponents();
  }));
Run Code Online (Sandbox Code Playgroud)

在一种情况下,出于某种原因,我还必须执行步骤 B)。

B)如果你直接在你的组件中使用翻译服务,例如this.translate.get('foo.bar'),你需要导入TranslateModule并使用 ngx-translateTranslateFakeLoader作为loader它。

你的component.spec.ts

import {TranslateFakeLoader, TranslateLoader, TranslateModule} from '@ngx-translate/core';
...
  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [ YourComponent ], // you may add TranslateMockPipe from step 1 here, too
      imports: [
        ...
        TranslateModule.forRoot({
          loader: {
            provide: TranslateLoader,
            useClass: TranslateFakeLoader
          }
        })
      ]
    })
    .compileComponents();
  }));
Run Code Online (Sandbox Code Playgroud)

这样,您可以使用 ngx-translate 内置存根,而不是按照问题中的建议创建自己的存根(它对我也不起作用)。