2017-10-31 11 views
3

メソッドA complete()ブロックをカバーする単体テストを作成しようとしています。 Deferredを使用してajaxリクエストを模擬することができます。しかし、Deferredはcomplete()をサポートしていないので、エラー以下になる TypeError:_this.methodB(...)。completeは関数ではありません。 methodB(..)。complete()ブロックをカバーするのを手伝ってください。ジャスミンJqueryスパイAJAX完全関数

methodB: function(xURL, container) { 
    var _this = this; 
    return $.ajax({ 

    type: 'GET', 
    url: xURL, 
    async: false, 
    dataType: 'html', 
    timeout: _this.ajaxTimeOut 
    }) 
    .fail(function(resp) { 
    _this.doSomethingOnFail(); 
    }) 
    .done(function(resp, textStatus, jqXHR) { 
     if (jqXHR.status === 200 && resp !== '') { 
      _this.doSomethingOnDone();  
    }    
    }); 
}, 
    methodA: function(e) { 
    var _this = this, 
    _this.methodB(_this.refineURL, _this.$el) 
    .complete(function(resp) { 
    **if (resp.responseText !== undefined && 
     resp.responseText.indexOf("PRICE_DATA_AVLBL = 'false'") > -1) { 
     var params1 = _this._getFilterURLParameters(_this.refineURL); 
     var params2 = _this._getFilterURLParameters(_this.SUCC_URL); 

     if (params1.lowerbound !== params2.lowerbound || 
      $(e.currentTarget).hasClass('js-txt-min')) { 
      $txtMin.addClass('border-danger'); 
     } else { 
      $txtMin.val(params2.lowerbound); 
     } 
    } else { 
     _this._pageSubmit(); 
    }** 

}); 

}

ユニットテストコード:

it('validate ajax complete', function ajaxComplete(){ 
     spyOn($, 'ajax').and.callFake(function fake() { 
     XMLHttpRequest = jasmine.createSpy('XMLHttpRequest');  
     var jqXHR = new XMLHttpRequest(); 
     jqXHR.status = 200; 
     var dea = new $.Deferred();  
     dea.resolve('{property:value}',' ', jqXHR); 
     return dea; 
    }); 
    f.methodA(); 
    }); 
+0

'methodA'をテストする場合は、' methodB'の内部について心配するべきではありません。あなたはメソッドBを嘲笑するべきです。私の[回答](https://stackoverflow.com/a/47037586/444610)を参照してください。 –

答えて

0

モックの依存関係

関数をテストするとき、あなたはその関数の依存関係を模擬することを覚えておくことが重要です。これらの関数をテストしていないため、実際にテストでこれらの依存関数を呼び出す必要はありません。あなたはmethodAをテストするとき、あなたはmethodB AJAXリクエストますことを気にしてはならないこれを念頭に置いてあなたのコード

など、他の場所でこれらの機能をテストし、その依存関係をからかっする必要があります。あなたが気にすべてが、それはcomplete機能を持っており、あなたが正しくコールバックを配線しているいくつかのオブジェクトなど

テスト

以下(未テスト)コードはおおよそのために働く必要を返すということですあなた、またはあなたにまともな出発点を与えてください。

describe('.methodA()', function() { 
    var methodBResult; 

    beforeEach(function() { 
    methodBResult = jasmine.createSpyObj('result', ['complete']); 
    spyOn(f, 'methodB').and.returnValue(methodBResult); 
    }); 

    it('should call .methodB()', function() { 
    f.refineURL = 'something for the test'; 
    f.$el = 'something else for the test'; 
    f.methodA(); 
    expect(f.methodB.calls.count()).toBe(1); 
    expect(f.methodB).toHaveBeenCalledWith(f.refineURL, f.$el); 
    }); 

    it('should register a callback on complete', function() { 
    f.methodA(); 

    expect(methodBResult.complete.calls.count()).toBe(1); 
    expect(methodBResult.complete).toHaveBeenCalledWith(jasmine.any(Function)); 
    }); 

    it('should call .doSomethingOnComplete() when the callback is invoked', function() { 
    spyOn(f, 'doSomethingOnComplete'); 

    f.methodA(); 

    var callback = methodBResult.complete.calls.argsFor(1)[0];  
    callback(); 

    expect(f.doSomethingOnComplete.calls.count()).toBe(1); 
    expect(f.doSomethingOnComplete).toHaveBeenCalledWith(); 
    }); 
}); 
+0

返事をありがとう。これは良い出発点です。私はresp.responseTextを使ってその空をチェックする完全なブロックでコードをカバーしようとしています。 –

+0

あなたの質問は少し誤解を招く。あなたはmethodA()をカバーしようとしていると言いました。このメソッドは 'complete'ブロックを使用する唯一のメソッドです。あなたが実際にmethodB()をカバーしようとしているようです。あなたの例は完全なブロックの 'resp'でも何もしません。 –

+0

コードを完全なブロックに含めないと申し訳ありません。私はかなりstackoverflowに新しいです。これは私が必要とする完全なブロックのコードです.complete(function(resp){ \t if(resp.responseText!== undefined && \t \t resp.responseText.indexOf( "PRICE_DATA_AVLBL = \t 'false'") > -1){ \t} } –

関連する問題