4

簡単な質問:

sinon.js で javascript をテストして、次の$.ajax2 つのことを行いながらメソッドが呼び出されることを確認します。

  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]]

.doneしたがって、jQueryリクエストをモックアップして、呼び出しに正常に応答できる応答を取得できるかどうか疑問に思っていると思いますが、defferedObject()十分に理解していないようです。

4

1 に答える 1

3

サーバーの応答をモックするには、次の戻り値をスタブ化します$.ajax

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

これはコールバックをスタブ化するだけであることに注意してくださいdone。他の動作をテストしたい場合は、おそらく他のハンドラー ( など) を実装する必要がありfailますthen

実際の jQuery Deferred オブジェクトを返すこともできます:

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

この場合、テストを実行する前に、返された Deferred を明示的にトリガーする必要があります。

  ...    
  @deferred.resolveWith(null, [{}]) # your object here
  ...
于 2013-02-26T11:44:53.917 に答える