2017-06-15 12 views
0
は、以下に示すよう

Iは2つのクラス、およびMyServiceでFooComponentを有する:TypeScript/JavaScriptコードのユニットテストで、内部サブスクライブイベントが発生するのを待つ方法を教えてください。

class MyService { 
    getStuff(): Observable<Any>() { 
     //Implementation that may take sometime to return 
    } 
} 

class FooComponent { 
    private myServiceSubscription: Subscription; 
    public FooModel : MyDateType; 

    constructor(private myService: MyService){ 
     this.FooModel = null; 
     this.myServiceSubscription = null; 
    } 

    Init() { 
     this.myServiceSubscription = this.myService.getStuff().subscribe(response => { 
      //Construct this.FooModel from response; 
     } 
    } 

    Done() { 
     if (this.myServiceSubscription !== null) { 
      myServiceSubscription.unsubscribe(); 
     } 
    } 
} 

FooComponentはMyServiceでのインスタンスを取得し、その初期化方法でgetStuffメソッドを呼び出します。 RxJsモジュールを使用するサブスクリプション呼び出しに注意してください。これは、Subscribeイベントが発生する前にInitメソッドが返されることを意味します。このコードに基づいて、私は(ジャスミンのフレームワークを使用して)ユニットテストを以下している:イベントはFooComponentのinitメソッドで焼成され、したがって、FooComponentインスタンスFooModelではないサブスクライブするまでテストが待たれていないため

describe('Component: Foo',() => { 

    it('Load Foo Model', (() => { 

     var myService = new MyService(); 
     var instance = new FooComponent(myService); 
     instance.Init(); 

     if (instance.FooModel == null) 
     { 
      fail("FooModel is null even after calling Init() method."); 
     } 
    })); 

}); 

このテストは常に失敗します人口が多い。

サブスクライブイベントが発生するのをテストがどのようにしてFooModelに値が設定されるかを確認するにはどうすればよいですか?

+0

私はhttp://sinonjs.org/releases/v2.3.4/stubs/を見てみてください。 – Jin

+0

MyServiceの模擬は問題ではありません。問題は、内部購読イベントが外部世界に発せられたことを知らせる方法です。 – Raghu

答えて

0

@Jin提案としてスタブを使用する必要があります。最も簡単な方法:

fdescribe('Component: Foo',() => { 

    it('Load Foo Model', (() => { 

     var myService = jasmine.createSpyObj('myService', ['getStuff']); 
     myService.getStuff.and.callFake(() => { 
      return Observable.of(/* response */); 
     }); 

     var instance = new FooComponent(myService); 
     instance.Init(); 

     if (instance.FooModel == null) 
     { 
      fail("FooModel is null even after calling Init() method."); 
     } 
    })); 

}); 

あなたはgetStuffから値を返す場合、同期後、Initでコールバックもsyncronously呼ばないと、タイムアウトか何かを使用しても必要であろう。

関連する問題