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