ngx-translate:在单元测试中翻译字符串
ngx-translate: Translate string in Unit Testing
如果它是静态测试,我可以获得该值,但每当我尝试获取转换后的值(使用 ngx-translate
)时,它都是空的。
<div id="header-title">
<h1>{{ 'MENU_TITLE' | translate | uppercase }}</h1>
</div>
这有效 和 returns 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);
});
不确定为什么要在单元测试中测试它。
它不起作用的原因是翻译管道与正在检索值的日志发生异步。
我假设您已经在 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);
});
})
);
祝你好运:)!
在 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');
}));
如果它是静态测试,我可以获得该值,但每当我尝试获取转换后的值(使用 ngx-translate
)时,它都是空的。
<div id="header-title">
<h1>{{ 'MENU_TITLE' | translate | uppercase }}</h1>
</div>
这有效 和 returns 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);
});
不确定为什么要在单元测试中测试它。
它不起作用的原因是翻译管道与正在检索值的日志发生异步。
我假设您已经在 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);
});
})
);
祝你好运:)!
在 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');
}));