与 i18next 相关的间歇性单元测试失败

Intermittent unit-test failure associated with i18next

我正在尝试对我的 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的初始化有关,并且在初始化完成之前测试用例是运行ning。虽然我不是很确定这个假设。

我应该改变什么,使这个测试用例变得确定?

附加信息:

  1. 如果此测试用例比其他测试用例早 运行 秒,则此测试用例成功 view related test cases
  2. 我创建了一个GitHub repo,有兴趣的reader/user可以重现这个问题。请记住,您可能 运行 多次测试以重现问题。

我猜你是对的。 i18next 的初始化调用是异步的。意味着它不会在测试 运行.

之前完成

您不想测试翻译本身 - 因此将测试用例的语言设置为 "cimode" 将导致一致的键 return 而不是翻译值。

原来这个问题实际上与我编写测试用例的方式有关。

之前我的结构如下。

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

我认为此自定义初始化代码干扰了其他具有默认引导的测试用例。我干脆把beforeEachi18n specs里拉出来,直接放到View specs测试套件下面。这意味着 View specs 测试套件下的所有测试用例都使用相同的 aurelia 引导设置。实际上这确实解决了我的问题。