Жасмин Jquery Spy AJAX полная функция

Я пытаюсь написать модульный тест, чтобы покрыть метод A complete() блок. Я могу смоделировать запрос AJAX, используя Deferred. Но Deferred не поддерживает complete (), поэтому я получаю ниже ошибку TypeError: _this.methodB(...). Complete не является функцией. Пожалуйста, помогите мне охватить метод methodB (..). Complete ().

    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();
  });

1 ответ

Ложные зависимости

Важно помнить, что при тестировании функции вы имитируете зависимости этой функции. Вы не хотите фактически вызывать эти зависимые функции в своих тестах, потому что вы не тестируете эти функции. Вы должны тестировать эти функции в другом месте, проверять их зависимости и т. Д.

Ваш код

Имея это в виду при тестировании 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();
  });
});
Другие вопросы по тегам