Как вы шпионите за обратным звонком в ajax-вызове с жасмином?

В настоящее время я использую enyo, и у меня есть функция компонента, которая принимает функцию обратного вызова и выполняет вызов ajax, а затем вызывает обратный вызов в случае успеха. Я не могу понять, как шпионить за функцией обратного вызова.

enyo.kind({
  name: 'Login',
  isLoggedIn: function (callback) {
      $.ajax({
        url: '/checkLogin'
      })
      .done(function (data) {
         /* Some logic here */
         return callback.apply(null, data);  //IF all goes well this should call the spy
      })
      .fail(function(){/*Fail Stuff*/});
  }
  ....
});

Для теста у меня есть:

describe('Valid User', function() {
   var ajaxSpy;
   var loginTest = new Login();
   beforeEach( function () {

      ajaxSpy = spyOn($, 'ajax').andReturn({
         done: function (fn ) {
             fn();
         },
         fail: function (){}
      });
   });

   it("should call the callback", function () {
      var spy = jasmine.createSpy("spy");
      loginTest.isLoggedIn(spy);
      expect(spy).toHaveBeenCalled();
   });
 }

В этом случае, когда это запускается, обратный вызов становится неопределенным, я думаю, что это, вероятно, из-за того, что шпион ajax перехватил его, но я не уверен, как это исправить.


person TripWired    schedule 21.01.2014    source источник


Ответы (1)


То, что делает вызов ajax, возвращает что-то, вызывающее promise.

Есть различные статьи, которые вы можете посмотреть по этому поводу:

Но в нижней строке вот пример кода о том, как этого добиться:

spyOn( $, 'ajax' ).andCallFake( function (params) {
    
  params.success({foo: 'bar'});
      
});

spyOn( $, "ajax" ).andCallFake( function (params) {
        
  params.error({foo: "bar"});
      
});
person Dalorzo    schedule 21.01.2014