web-dev-qa-db-ja.com

仕様に期待はありません-Jasmineがコールバック関数をテストしています

d3 timerを使用して呼び出されるメソッドがあります。メソッドが呼び出されるたびに、メソッドは2つの値を持つオブジェクトを発行します。値の1つは、時間の経過とともに増加します。値が昇順であるかどうか(つまり、時間とともに増加するかどうか)を確認するテストを作成したいと思います。

したがって、これに取り組むために、私のテストでは、イベントエミッターをサブスクライブし、サブスクリプション内で、受信したオブジェクトをローカル配列にプッシュしています。そして、array[i]array[i+1]よりも小さいことを期待しています。私の論理は完全に正しいと思いますが、ジャスミンからthe spec has no expectationsというエラーが出たのに、なぜエラーが出るのかわかりません。

これがコードです:

let x = d3.timer((elapsed) => { 
    this.method(); // call the function
    if(elapsed >= 500) {
     x.stop(); // stops the timer.
    }
});

method(elapsed) {
 // do something
 if(elapsed > 500) {
   this.output.emit({x: somevalue, y: somevalue, f: increasingvalue });
 }
}

ジャスミン仕様:

it('my spec', inject([JumpService], (service: JumpService) =>{
  array = [];
  //service calls the method
  service.output.subscribe(e => {
   array.Push(e);
   // A console statement here will give me the length and the object pushed.
   for(let i = 0; i< array.length - 1; i++) {
    expect(array[i].f).toBeLessThan(array[i+1].f);
   }

  });

}));

ここで何か悪いことをしていますか?このようなシナリオにどのように取り組むことができますか?正しい方向に案内してください。

ありがとうございました。

19
zelda

一般に、非同期コールバック関数をテストする場合、プロミスが解決された後にテストの出力を期待することが常に重要です。 Angularテストベッドフレームワークのtick()fakeAsync()とともに使用するか、または以下を使用して非同期メソッドをテストするJasmineの一般的な方法にフォールバックできます。 done()

done()の使用:

_it('my spec', (done) => {
  array = [];
  service.output.subscribe(e => {
   array.Push(e);
   for(let i = 0; i< array.length - 1; i++) {
    expect(array[i].f).toBeLessThan(array[i+1].f);
   }
   done();
  });
});
_

この回答がお役に立てば幸いです。

注:fakeAsync()tick()はあまりうまくいかなかったため、回答には含めていません。申し訳ありません。

11
ShellZero

@angular/core/testingasync関数を使用してみてください。それ

非同期テストゾーンでテスト関数をラップします。このゾーン内のすべての非同期呼び出しが完了すると、テストは自動的に完了します。 {@link inject}呼び出しをラップするために使用できます。

以下のコード例を見つけてください:

it('...', async(inject([AClass], (object) => {
  object.doSomething.then(() => {
   expect(...);
  })
});
9
Aliaksei Maniuk

Promise()の最後にdone()を使用する必要がありますが、Jasmine 2.8.0以降では、done()メソッドの実装がないため機能しません。次のような約束をテストする必要があります。

it('does test promise',
    inject([MyService], async (myService: MyService) => {
        const result = await myService.serviceToTest()
        expect(result).not.toBeNull()
        expect(result).toBe('Some Value')
     })
)

これがあなたを助けることを願っています

1