2016-09-06 4 views
0

次のようなサービスがあります。上記を使用してコントローラのジャスミンでコールバックメソッドの機能をテストします

InvService(...){ 
    this.getROItems = function(cb){ 
    $http.get('url').success(cb); 
    } 
} 

ワン:ジャスミンで

var roItems = []; 
InvService.getROItems(function(res){ 
    roItems = res.lts.items; 
}); 

、私はroItemsが応答から値を割り当てられていることをテストします。どうすればこれを達成できますか?

+0

コールバックの代わりに約束を使用するようにパターンを変更することを検討することをお勧めします。 'this.getROItems = function(){return $ http.get( 'url');}のようになります。 } 'と' InvService.getROItems.then(function(res){roItems = res.lts.items;}) 'となります。約束を使用することはAngularJS(あなたが使用していると思われる)全体にわたって非常に標準的です。 –

答えて

1

サービスとコントローラのテストを分けておくことをお勧めします。 roItemsが割り当てられたことをテストする場合は、コントローラをテストする必要があります。その後、あなたはサービスを模擬することができます。なぜなら、それはコントローラのテストとは関係がないからです。

describe('my awesome test', function() { 

    it('my awesome test block',       
     inject(function(InvService, $controller) { 
       //This mocks your service with a fake implementation. 
       //Note that I mocked before the controller initialization. 
       spyOn(InvService, 'getROItems').and.callFake(function(cb){ 
        var resultFake = { 
         lts: { 
          items: "whatever you want" 
         } 
        } 
        cb(resultFake); 
       }); 
       //This initializes your controller and it will use the mocked 
       //implementation of your service 
       var myController = $controller("myControllerName"); 

       //Here we make the assertio 
       expect(myController.roItems).toBe("whatever you want"); 
     } 
) 
}); 
+0

ここにいくつかの味を加えてみましょう:ここで@PedroVazがやっていることは、コントローラをテストするときにサービスコールを "嘲笑"していることです。これにより、コントローラーがサービスに呼び出す作業単位をテストするようになります。 '$ http.get'をモックし、' getROItems'が正しく呼び出すことを保証する別のテストを行います。 '$ http.get()'が動作することをテストする必要はありません。私はAngularJSチームが既にそれをしたと思う:)。 –

+0

追加ありがとう@MikeMcCaughan :) –

+0

確かに、あなたの答えを編集し、そこにポップしてください。 –

関連する問題