我有一个使用此库的应用程序。如何使用它测试组件?我不想测试图书馆。我只需要启动组件测试就不会出现关于TranslateModule,TranslateService,TranslateStore的多个错误,直到编译时出现错误。
是否有一种简单的方法可以以此依赖项运行测试?
再一次,我不想测试该库(检查字符串是否正在翻译),我需要在依赖于此库的组件上运行测试。
答案 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()
对于使用翻译服务或管道的组件的测试应该运行正常!