環境
私は基本的な を持っていますがPipeTransform
、それが非同期であるという事実を期待しています。なんで?私は独自の i18n サービスを持っているため (解析、複数形化、およびその他の制約のため、独自に行いました)、次の値を返しますPromise<string>
。
@Pipe({
name: "i18n",
pure: false
})
export class I18nPipe implements PipeTransform {
private done = false;
constructor(private i18n:I18n) {
}
value:string;
transform(value:string, args:I18nPipeArgs):string {
if(this.done){
return this.value;
}
if (args.plural) {
this.i18n.getPlural(args.key, args.plural, value, args.variables, args.domain).then((res) => {
this.value = res;
this.done = true;
});
}
this.i18n.get(args.key, value, args.variables, args.domain).then((res) => {
this.done = true;
this.value = res;
});
return this.value;
}
}
このパイプはうまく機能します。なぜなら、遅延呼び出しは最初のものだけだからです (I18nService
遅延読み込みを使用し、キーが見つからない場合にのみ JSON データをロードするため、基本的に、最初の呼び出しは遅延し、他の呼び出しは即時ですが、それでもまだです)非同期)。
問題
を使用してこのパイプをテストする方法がわかりませんJasmine
。コンポーネント内で動作しているため、動作することがわかっていますが、ここでの目標は、ジャスミンを使用してこれを完全にテストすることです。このようにして、CI ルーチンに追加できます。
上記のテスト:
describe("Pipe test", () => {
it("can call I18n.get.", async(inject([I18n], (i18n:I18n) => {
let pipe = new I18nPipe(i18n);
expect(pipe.transform("nope", {key: 'test', domain: 'test domain'})).toBe("test value");
})));
});
I18nService
によって与えられた結果が非同期であるため、戻り値が同期ロジックで定義されていないため、失敗します。
I18n パイプ テストは I18n.get を呼び出すことができます。失敗した
「テスト値」は undefined であると予想されます。
編集:それを行う1つの方法は使用することですが、どこにでもsetTimeout
追加するのを避けるために、よりきれいなソリューションが必要です。setTimeout(myAssertion, 100)