2012-06-11 3 views
4

достаточно простой вопроса:Использование Sinon.js и предотвращение вызова на мой сервер приложений

Я хочу, чтобы проверить sinon.js куска JavaScript, чтобы убедиться, что он вызывает метод $.ajax, делая две вещи:

  1. Я не хочу, чтобы на самом деле попал серверу
  2. Я хочу, чтобы импровизировать ответ от сервера

так вот JS:

$.ajax 
    url: "/tickets/id.json" 
    dataType: 'json' 

    .done (data) => 
    HandlebarsTemplates["tickets/popup_title"] data 

и вот мой тест:

describe 'PopupDisplayer', -> 

    beforeEach -> 
    loadFixtures 'popup_displayer' 
    new PopupDisplayer 

    @title_stub = sinon.stub(HandlebarsTemplates, "tickets/popup_title") 

    @jquery_stub = sinon.stub(jQuery, 'ajax').yieldsTo('done', {}) 

    //This triggers the ajax call 
    $('.popupable .title').mouseenter() 

    afterEach -> 
    HandlebarsTemplates['tickets/popup_title'].restore() 
    HandlebarsTemplates['tickets/popup_content'].restore() 

    jQuery.ajax.restore() 

    @server.restore() 

    it 'renders the title with the data returned from the server', -> 
    expect(@title_stub).toHaveBeenCalledWith({}) 

Этот тест не хотя со следующими исключениями:

TypeError: ajax expected to yield to 'done', but no object with such a property was passed. Received [[object Object]] 

Так что я думаю, я задаюсь вопросом, могу ли я макет запрос Jquery к получите ответ, который может успешно ответить на звонок .done, по-видимому, я недостаточно понимаю defferedObject().

+1

Пожалуйста [не добавляют подписей или подписчиков на ваши сообщения] (http://stackoverflow.com/faq#signatures). Кроме того, вместо использования '' для встроенного кода вы должны использовать '' 'backticks \' '. – meagar

ответ

3

Чтобы издеваться ответ сервера вы хотите окурок возвращаемого значения $.ajax:

... 
    @jquery_stub = sinon.stub(jQuery, 'ajax').returns 
    done: (callback) -> callback {...} # your object here 
    ... 

Обратите внимание, что это только окурки done обратного вызова. Если вы хотите протестировать другие виды поведения, вам, вероятно, потребуется реализовать другие обработчики (fail, then и т. Д.).

Вы также можете вернуть реальный JQuery Отложенный объект:

...  
    @deferred = new jQuery.Deferred 
    @jquery_stub = sinon.stub(jQuery, 'ajax').returns(deferred) 
    ... 

В этом случае вам придется явно вызвать Возвращенный Отложенный, прежде чем делать тесты:

...  
    @deferred.resolveWith(null, [{}]) # your object here 
    ...