2015-01-18 3 views
0

Я пытаюсь проверить эту простую Ajax-запрос с Жасмин:Тест простой ajax- Успех Обратный вызов

var Card = { 
    single : function(params){ 
     $.ajax({ 
      dataType: "json", 
      headers: {"X-TOKEN": TOKEN}, 
      url: SERVER, 
      success: function(data,status,xhr){ 
       params.params['card'] = data['card']; 
       params.callback(params.params); 
      }, 
      error: function(xhr, status, error) { 
        ErrorHandler.connection(xhr,status,error); 
      } 
     }); 
    }, 

Мой код теста:

 it("should call Callback with appropiate Callbacks", function(){ 
      var Meth = {test_method: function(params){}}; 
      spyOn(Meth,"test_method"); 
      spyOn($, "ajax").and.callFake(function(e) { 
       e.success('one','two','three'); 
      }); 
      Card.single({id: 2, params: {callback: Meth.test_method}}); 
      expect(Meth.test_method).toHaveBeenCalled(); 
     }); 

Я просто не могу понять, почему мой тест Безразлично» работа! Вместо этого я получаю ошибку, что-то неопределенное:

Uncaught TypeError: undefined is not a function 

В этой линии Жасмин Libary jasmine.js 2108:

this.result.failedExpectations.push(this.expectationResultFactory(data)); 

Что делать я неправильно? Благодаря!

+0

Ну 'params.callback (params.params);' неправильно – epascarello

+0

Ой спасибо! Знаете ли вы решение, как я могу передать параметры этого «успешного» блока? Благодаря! –

+0

Нет обратного вызова не будет вызываться, так как вы не ссылаетесь на правильный ... – epascarello

ответ

0

Вы можете попытаться изменить

params.params['card'] = data['card']; 
params.callback(params.params); 

в

params.params['card'] = data['card']; 
params.params.callback(params.params); 

Также для модульного теста Ajax часто бывает проще использовать синус (http://sinonjs.org/docs/#server) внутри жасмина beforeEach и afterEach, как это.

beforeEach(function() { 
    this.server = sinon.fakeServer.create(); 
    }); 

afterEach(function() { 
    this.server.restore(); 
}); 

в тесте, то вы можете издеваться из вызова, как так

this.server.requests [0] .respond (200, { "Content-Type": "применение/JSON"}, '[{"id": 12, "comment": "Hey there"}]');

Наконец, вы можете проверить шпиона, чтобы увидеть, если он был назван

0

spy.and.callFake() будет делегировать вызовы функции, а не cll исходную функцию вообще. http://jasmine.github.io/2.1/introduction.html#section-Spies:_and.callFake

В противном случае пример без Ajax вызова

describe('test', function() { 
    it("should call Callback with appropiate Callbacks", function(){ 
     var called = false; 
     var Meth = {test_method: function(params){ 
      called = true; 
     }}; 
     spyOn(Meth,"test_method").and.callFake(function(){ 
     }); 
     Meth.test_method(); 
     expect(Meth.test_method).toHaveBeenCalled(); 
     expect(called).toBe(true); 
    }); 
}); 

Passing пример без вызова Ajax

describe('test', function() { 
    it("should call Callback with appropiate Callbacks", function(){ 
     var called = false; 
     var Meth = {test_method: function(params){ 
     }}; 
     spyOn(Meth,"test_method").and.callFake(function(){ 
      called = true; 
     }); 
     Meth.test_method(); 
     expect(Meth.test_method).toHaveBeenCalled(); 
     expect(called).toBe(true); 
    }); 
}); 
+0

Спасибо! Но я бы хотел протестировать обратный вызов Ajax-Success! –

Смежные вопросы