2013-06-26 7 views
5

私は、AngularJSとユニットテストの実践の両方にとって非常に新しい初心者のプログラマです。私はこれに解決策を見出そうと数時間を費やしましたが、ますます混乱しています。誰かが正しい方向に私を指すことができれば、私はそれを非常に感謝します。私は可能な限り記述的にしようとします。私は機能のカップルを持っているAngularJS(サービスA)でサービスを作成しているカルマ/ジャスミンユニット依存関係を持つAngularJSサービスのテスト

状況がこれです。これらの関数はそれぞれ、$ http GETリクエストをREST APIに送り、JSONデータを含む$ http promiseオブジェクトを返します。これらの関数の中で、URLは、サービスAへの依存として注入された別の非常に単純なサービス(サービスB)の実装を通じて構築されます。私はサービスBのモックを作成して、すべての依存関係から切り離しました。これらのサービスは、どちらも "services"という名前の同じモジュールの内部で定義されています。この場合、この依存関係は本当に必要ありませんが、その仕組みを理解したいだけです。

Jasmineを使用して、サービスAのユニットテストを構築して、APIに対するリクエストが正しく構築されていることを確認します。正しいJSONデータが返されているかどうかを確認します。同時に、私は実際のAPI呼び出しを行うことを望んでいません。

は、これは私が知っているものです:

$ httpBackendモックは、私がAPIに偽の呼び出しを行うことができるようにする必要があり、それは特定の要求を期待して指定された結果を返すための機能を提供するものです。

実際のサービスAをテストし、サービスBの作成したモックを注入する必要があります.Jasmine Spiesと$ provideを使用してこれを行う方法があります。私はsinon.jsが使用されている例も見てきましたが、どちらが最善のアプローチか分かりません。


私は以下のソースコードをCoffeeScriptで記述します。

サービスA:

'use strict' 

angular.module("services") 
    .service("ServiceA", ["$http", "ServiceB", ($http, ServiceB) -> 

    #Uses underscore.js to set this default attribute 
    defaults = withCredentials:true 

    getVarset: (itemName, options={}) -> 
     options.method = "GET" 
     options.url = ServiceB.makeUrl("item/#{itemName}") 

     $http _.defaults(options, defaults) 

    getVarsets: (options = {}) -> 
     options.method = "GET" 
     options.url = ServiceB.makeUrl("items") 

     $http _.defaults(options, defaults) 

    getModelsForVarset: (itemName, options = {}) -> 
     options.method = "GET" 
     options.url = ServiceB.makeUrl("item/#{itemName}/prices") 

     $http _.defaults(options, defaults) 
    ]) 

サービスB:

'use strict' 

angular.module('services') 
    .service 'ServiceB', [ -> 

    # Just return the string 
    # This service builds the real URL, but I've removed this 
    makeUrl: (Url) -> 
     "#{Url}" 
    ] 

答えて

4

ので、あなたが$提供/ジャスミンのスパイでこれを行う方法を知っていると言っているし、代替案を探しています?私はたいてい$ mockingのために$ provide/spyメソッドを使用しましたが、これまでのところ私にとってはうまくいきました。

何かのように:あなたは、サービスAのHTTPリクエストを模擬するために$ httpBackendを使用したい場合は、その後

beforeEach(function() { 

    // set up a default value for your mock 
    bMock = { 
     makeUrl: jasmine.createSpy('makeUrl() mock').andReturn('http://www....') 
    } 

    // use the $provide service to replace ServiceB 
    // with your mock 
    module('services', function($provide) { 
     $provide.value('ServiceB', bMock); 
    }); 

}); 

it('should do what its supposed to do', function() { 
    // test... 
}); 

、あなただけ.when呼び出して、$ httpBackendをつかむために$インジェクタのサービスを使用する必要があります(...)これを設定するには、la http://docs.angularjs.org/api/ngMock.$httpBackend

関連する問題