Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ngx-translate: Translate string in Unit Testing

I can get the value if it's a static test, but whenever I'm trying to get the translated value (using ngx-translate), it's empty.

<div id="header-title">
    <h1>{{ 'MENU_TITLE' | translate | uppercase }}</h1>
</div>

This works and 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);
});

Importing translate module

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----- but not sure if this is the right way to do

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);
});
like image 438
Greg Avatar asked Mar 08 '18 11:03

Greg


2 Answers

Found a solution to translate a key in Unit Testing

First you check if your textContent equals the translate key. Then you set a translation for that key and check again if it translated:

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');
}));
like image 94
Greg Avatar answered Nov 18 '22 22:11

Greg


Not sure why you would want to test this for a unit test.

The reason it doesn't work is that the translate pipe is async with the log happening while it is still retrieving the value.

I am going to assume you are already providing the TranslateModule in the TestBed.

Now, I am not sure if this will 100% work, so maybe you can give it a go. However, in theory, you can try using async and 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);
      });
    })
  );

Good luck :)!

like image 41
Jmsdb Avatar answered Nov 18 '22 22:11

Jmsdb