ngx-翻译如何测试组件

时间:2018-11-19 08:10:10

标签: angular typescript testing internationalization ngx-translate

我有一个使用此库的应用程序。如何使用它测试组件?我不想测试图书馆。我只需要启动组件测试就不会出现关于TranslateModule,TranslateService,TranslateStore的多个错误,直到编译时出现错误。

是否有一种简单的方法可以以此依赖项运行测试?

再一次,我不想测试该库(检查字符串是否正在翻译),我需要在依赖于此库的组件上运行测试。

4 个答案:

答案 0 :(得分:0)

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

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

它只会显示翻译键

答案 1 :(得分:0)

(已在Angular 8.1.0和ngx-translate 11.0.1中进行了测试)

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

translate-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;
  }
}

your-component.spec.ts

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

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

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

your-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();
  }));

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

答案 2 :(得分:0)

对我来说,ngx-translate-testing效果很好 this

第一

import { TranslateTestingModule } from 'ngx-translate-testing';

然后

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

然后测试

  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');
  }));

答案 3 :(得分:-1)

我要做的是在我导入到TranslationModule的单独SharedModule中设置所有与翻译相关的配置。

import { TranslateModule, TranslateLoader } from '@ngx-translate/core';

@NgModule({
  declarations: [],
  imports: [CommonModule,
    TranslateModule.forRoot({
      loader: {
        provide: TranslateLoader,
        useFactory: IfYouHaveACustomFactory,
        deps: [HttpClient]
      }
    })],
  exports: [TranslateModule],
  providers: [],
})
export class TranslationModule {

}

然后可以将其导出到所有导入SharedModule的组件中,

@NgModule({
  imports: [],
  exports: [TranslationModule, SomeOtherModule],
})
export class SharedModule { }

在规范文件中,您只需像{p1}中那样将SharedModule导入

TestBed.configureTestingModule()

对于使用翻译服务或管道的组件的测试应该运行正常!