Прерывистая ошибка модульного теста, связанная с i18next - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь выполнить модульное тестирование своего пользовательского элемента aurelia, который выглядит следующим образом.

// BaseText.ts
import { bindable } from "aurelia-framework";
import { BaseI18N } from "aurelia-i18n";

export class BaseText extends BaseI18N {
    @bindable public value: string;
    @bindable public i18nKey: string;
}

// NormalText.ts
export class NormalTextCustomElement extends BaseText {}

// NormalText.html
<template>
    <span t.bind="i18nKey">${value}</span>
</template>

Теперь я хочу проверить, изменил ли я значение i18nKey, переведенный текст отображается вэлемент.Чтобы проверить это, я написал следующий контрольный пример.

describe("i18n specs", () => {

    let component;
    beforeEach(() => {
        component = StageComponent
            .withResources("NormalText/NormalText")
            .inView("<normal-text id='i18n1' value='Ignored Text' i18n-key='test'></normal-text>");

        component.bootstrap((aurelia: Aurelia) => aurelia.use
            .standardConfiguration()
            .plugin(PLATFORM.moduleName("aurelia-i18n"), (instance) => {
                const aliases = ["t"];
                TCustomAttribute.configureAliases(aliases);

                return instance.setup({
                    attributes: aliases,
                    fallbackLng: "en",
                    lng: "en",
                    resources: {         //<-- translation resources
                        en: {
                            translation: {
                                test: "English test"
                            }
                        }
                    }
                });
            }));

    });

    it("Should render the translated text with a i18nKey", (done) => {
        component
            .create(bootstrap)
            .then(() => {
                const spanElement = document.querySelector('normal-text#i18n1>span');
                expect(spanElement.textContent.trim()).toBe('English test');
            })
            .catch(e => { console.log(e.toString()) })
            .finally(() => {
                component.dispose();
                done();
            });
    });
});

Теперь проблема в том, что этот контрольный пример прерывается с перерывами, что, несомненно, будет проблемой для CI.Я подозреваю, что он что-то делает для инициализации i18next, и тестовый пример выполняется до завершения инициализации.Хотя я не очень уверен в этой гипотезе.

Что я должен изменить, чтобы этот тестовый пример стал детерминированным?

Дополнительная информация:

  1. Этот тестовый пример успешен, если он выполняется перед каждым другим просмотром связанных тестовых примеров .
  2. Я создал GitHub repo , чтобы заинтересованный читатель / пользователь мог воспроизвести проблему.Помните, что вы могли запускать тесты несколько раз, чтобы повторить проблему.

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Оказалось, что проблема на самом деле связана с тем, как я писал тестовые случаи.

Ранее я структурировал его так, как показано ниже.

describe("View specs", ()=> {
  // here goes other test suite and/or test cases
  describe("i18n specs", () => {

    let component;
    beforeEach(() => {
      // here goes the custom initialization code of aurelia, as shown in question
    });
  });
});

Я думаю, что этот пользовательский код инициализации мешал другим тестам с загрузкой по умолчанию.Я просто вытащил beforeEach из i18n specs и поместил его прямо под набор тестов View specs.Это означает, что все тестовые наборы в View specs тестовом наборе используют одну и ту же настройку начальной загрузки aurelia.И на самом деле это решило мою проблему.

0 голосов
/ 31 мая 2018

Думаю, ты прав.Начальный вызов i18next является асинхронным.Означает, что он не будет завершен до запуска теста.

Вы не хотите тестировать сами переводы - поэтому установка языка "cimode" для тестовых случаев приведет к последовательному возврату ключа вместо значения перевода,

...