【问题标题】:ngx-translate how to test componentsngx-translate 如何测试组件
【发布时间】:2019-04-21 13:46:57
【问题描述】:

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

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

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

【问题讨论】:

    标签: angular typescript testing internationalization ngx-translate


    【解决方案1】:

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

    第一

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

    【讨论】:

      【解决方案2】:

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

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

      翻译-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 内置存根,而不是按照 issue 中的建议创建自己的存根(它也不适用于我)。

      【讨论】:

        【解决方案3】:

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

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

        它只会显示翻译键

        【讨论】:

        • 在 angular 8 + ngx-translate/core 中工作正常": "^11.0.1,谢谢
        • 适用于 angular 11
        【解决方案4】:

        我所做的是在单独的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 { }
        

        在您的规范文件中,您只需将SharedModule 导入您的TestBed.configureTestingModule()

         beforeEach(async(() => {
            TestBed.configureTestingModule({
              imports: [
                RouterTestingModule,
                SharedModule,
        ...
        

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

        【讨论】:

        • 我喜欢这个主意,但它对我不起作用。当我从我之前拥有的 app.module.ts 中删除 TranslateModule.forRoot({...}) 内容时,翻译管道不再翻译任何内容。仅仅导入我的共享模块并不足以让它工作。
        • 在测试中我得到像NullInjectorError: StaticInjectorError(DynamicTestModule)[TranslatePipe -> ChangeDetectorRef]: StaticInjectorError(Platform: core)[TranslatePipe -> ChangeDetectorRef]: NullInjectorError: No provider for ChangeDetectorRef!这样的错误
        猜你喜欢
        • 2018-03-01
        • 1970-01-01
        • 2020-02-19
        • 1970-01-01
        • 2018-08-16
        • 2022-12-19
        • 1970-01-01
        • 1970-01-01
        • 2021-06-26
        相关资源
        最近更新 更多