2016-11-03 16 views
0

とのユニットテストのXMLHttpRequest私は、以下の機能を持っている、(私はノイズを取り除くためのコードを省略しました)ジャスミン、約束

CodeApiClient.prototype = { 
    get: function(endpoint, paramStr, headers){ 
     var defer = new Q.defer(); 
     var start_time = new Date().getTime(); 

     var req = new XMLHttpRequest(); 
     var url = endpoint + (paramStr.indexOf('?') !== -1 ? paramStr : '?' + paramStr); 

     req.open('GET', url); 

     req.onload = function() { 
      var request_time = new Date().getTime() - start_time; 
      // This is called even on 404 etc 
      if (req.status < 400) { 
       var response = JSON.parse(req.response) 
       response.__request_time = request_time; 
       defer.resolve(response); 
      } else { 
       // Otherwise reject with the status text 
       defer.reject(Error(req.statusText)); 
      } 
     }; 
} 

私の質問は次のとおりです。getConfigのジャスミンテスト、つまり応答を偽装し、基になるXMLHttpRequestをスタブするにはどうすればよいですか? これはsinon.jsに対応しています。私はそれが$アヤックスにコールバックスタブことができます知っているが、これはここではJavaScript、ノー角度など

答えて

1
  • callFakeを使用する方法である純粋であるようにQ.注としてlibに私は約束でこれを行う方法がわからないんだけどジャスミンで約束を返す
  • Qと従来のjQueryの両方が遅延オブジェクト を提供しているので、$ .Deferred()をQ.defer()に置き換えることができます。

var tempObj = { 
 
    \t getConfig: function(params){ 
 

 
       return this.codeApiClient.get(this.endpoints.config, params, {}).then(function(response){ 
 
        return response; 
 
       }, function(err){ 
 
        throw err; 
 
       }); 
 
      } 
 
     codeApiClient : { 
 
      get : function(){ 
 
      // some get function of codeApiClient 
 
      } 
 
     } 
 
    } 
 

 

 
    it('test getConfig success', function(){ 
 
    \t var dummyResponse = {'someDummyKey' : 'someDummyValue'}; 
 
    \t spyOn(tempObj.codeApiClient, 'get').and.callFake(function(e){ 
 
    \t \t return $.Deferred().resolve(dummyResponse).promise(); 
 
    \t }); 
 
     tempObj.getConfig({}); 
 
     //any expectations 
 
    }); 
 

 
    it('test getConfig failure', function(){ 
 
    \t var dummyResponse = {'error' : 'someDummyFailure'}; 
 
    \t spyOn(tempObj.codeApiClient, 'get').and.callFake(function(e){ 
 
    \t \t return $.Deferred().reject(dummyResponse).promise(); 
 
    \t }); 
 
     tempObj.getConfig({}); 
 
     //any expectations 
 
    });

+0

あなたの例では、エラーを与えるのに役立ちます願っています。エラー::get()メソッドはありませんが存在しない 使用法:node_modules/jasmine-core/lib/jasmine-coのspyOn() re/jasmine.js(line 2075) – Rory

+0

私は今この回答を投票しました。私の実際のコードに彼の答えをリファクタリングして、私は今フルモックなどの作業ユニットテストをしています。寒い冬の兵士: - ) – Rory

+0

私はあなたを助けることができてうれしいです。エラーを取り除くために、答えbtwを編集しました。投票ありがとう。 –

0

誰もが興味を持っている場合は、ここで私のジャスミンのテストだ、それは

define([ 'q', 'lodash', 'jquery', 'ChatApi'], function (Q, _ , $ , ChatApi) { 

    describe('Chat Api test', function() { 
     var categories 
     var chatApi; 
     var fakeResponse; 

     beforeEach(function() { 
      //fakes 
      categories = { 
       "l10n": { 
        "defaultLanguage": "en-GB", 
        "languages": [ 
         { 
          "name": "en-GB", 
          "value": "Tell me more..." 
         }, 
         { 
          "name": "fr", 
          "value": "On veut tout savoir..." 
         }, 
         { 
          "name": "de", 
          "value": "Wähle die passende Kategorie aus..." 
         } 
        ] 
       } 
      }; 
      fakeResponse = { 
       'categories': categories 
      } 
      chatApi = new ChatApi("https://server/gateway/","v1"); 
     }); 

     it('test getConfig success', function(done){ 
      var getConfigCalled = spyOn(chatApi, 'getConfig').and.callFake(function(e){ 
       //jQuery version of promises 
       //return $.Deferred().resolve(fakeResponse).promise(); 
       var deferred = Q.defer(); 
       deferred.resolve(fakeResponse); 
       return deferred.promise; 
      }); 

      chatApi.getConfig({}).then(function(response){ 
       //compare objects using lodash 
       var x = _.isEqual(response.categories, fakeResponse.categories); 
       expect(x).toBe(true); 
      }) 

      expect(getConfigCalled).toHaveBeenCalled(); 

      done(); 
     }); 

    }); 
}); 
関連する問題