6

ajaxRequest (1) (2) を実装する次の 2 つの方法は同等である必要があります。
そうは言っても:

  1. コールバックが実行されたことを検証する単体テスト (3) が (1) で成功し、(2) で失敗するのはなぜですか?
  2. (2) の成功コールバックをスパイするには、テスト (3) をどのように書き直すべきですか?
  3. stub jQuery.ajaxsinon とコード (2) を使用しようとする と、エラーが発生します。どうすれば直せますか?

詳細については、コード (3) のコメントを参照してください。


(1)

ajaxRequest: function (message, callback) {
    return $.ajax({
        url: backendRouter.generate('feedback_send'),
        type: 'POST',
        dataType: 'json',
        data: {
            message: message
        },
        success: callback
    });
}

(2)

ajaxRequest: function (message, callback) {
    return $.ajax({
        url: backendRouter.generate('feedback_send'),
        type: 'POST',
        dataType: 'json',
        data: {
            message: message
        }
    }).success(callback);
}

(3)

it("should execute the callback function on success", function () {
    spyOn($, "ajax").andCallFake(function(options) {
        options.success();
    }); // If I use the code (2) I get the following error
        // TypeError: Object #<Object> has no method 'success'
    var callback = jasmine.createSpy();
    ajaxRequest('some message', callback);
    expect(callback).toHaveBeenCalled();
});

(4)

it("makes a GET request for todo items", function () {
    sinon.stub(jQuery, 'ajax');
    backendController.ajaxRequest('some message', sinon.spy()); 
    // Cannot call method 'success' of undefined
});
4

2 に答える 2

4

チュートリアルは次のとおりです。

番号 2 のコードを使用すると、jquery で ajax 関数を呼び出すことになります。

return $.ajax({
  url: backendRouter.generate('feedback_send'),
  type: 'POST',
  dataType: 'json',
  data: {
    message: message
  }
...

これらのパラメーターを指定してこの関数を呼び出した後、jQuery は成功関数が定義されているjqHRを返します。その成功関数が呼び出されます。

...
}).success(callback);

jasmine テストが ajax 関数をスパイするまで、これまでのところすべて順調です。呼び出しに使用したのと同じオプション$.ajaxが、この新しいスパイに渡されます。

// this is the value of the options parameter
{
    url: backendRouter.generate('feedback_send'),
    type: 'POST',
    dataType: 'json',
    data: {
        message: message
    }
}

このオブジェクトが渡されると、偽の関数が実際に を呼び出そうとしますがoptions.success、これは存在しません! したがって、エラー。

于 2012-08-23T09:19:54.720 に答える