55

jQuery .ajax() の約束を返すかなり単純な関数があります。

CLAW.controls.validateLocation = function(val, $inputEl) {
    return $.ajax({
        url: locationServiceUrl + 'ValidateLocation/',
        data: {
            'locationName': val
        },
        beforeSend: function() {
            $inputEl.addClass('busy');
        }
    }).done(function(result) {
        // some success clauses
    }).fail(function(result) {
        // some failure clauses
    }).always(function() {
        // some always clauses
    });
}

ほとんどの場合、この新しい promise インターフェースは夢のように機能し、jQuery の .ajax() を使用するときにコールバック ピラミッドを排除することは素晴らしいことです。ただし、Jasmine および/または Sinon を使用してこれらの約束を適切にテストする方法を理解することはできません。

  1. Sinon のドキュメントはすべて、昔ながらのコールバックを使用していることを前提としています。promises/deferreds でそれを使用する方法の単一の例が表示されません

  2. Jasmine または Sinon スパイを使用して $.ajax をスパイしようとすると、スパイは事実上 promise を上書きするため、そのdone,failおよびalways節が ajax 関数に存在しなくなり、promise が解決されず、代わりにエラーが発生します。

前述のテスト ライブラリを使用してこれらの新しい jQuery .ajax() の約束をテストする方法の 1 つまたは 2 つの例が本当に好きです。私はかなり熱心にネットを調べましたが、実際には何もかき集めていません。Jasmine.ajax を使用して言及されている 1 つのリソースを見つけましたが、Sinon がすぐに使用できるほとんどの同じ機能を提供することを考えると、可能であればそれを避けたいと思います。

4

4 に答える 4

106

実際にはそれほど複雑ではありません。プロミスを返し、ケースに応じて解決するだけで十分です。

例えば:

spyOn($, 'ajax').andCallFake(function (req) {
    var d = $.Deferred();
    d.resolve(data_you_expect);
    return d.promise();
});

成功のために、または

spyOn($, 'ajax').andCallFake(function (req) {
    var d = $.Deferred();
    d.reject(fail_result);
    return d.promise();
});

失敗のために。

Jasmine 2.0 では、構文がわずかに変更されました。

spyOn($, 'ajax').and.callFake(function (req) {});

メソッド .andCallFake() は Jasmine 2.0 には存在しません

于 2012-10-31T19:07:28.707 に答える
0

のようなものを使用すると、@ggozad によって提供されたソリューションは機能しません.complete()

しかし、万歳、ジャスミンはまさにこれを行うプラグインを作成しました: http://jasmine.github.io/2.0/ajax.html

beforeEach(function() {
  jasmine.Ajax.install();
});

afterEach(function() {
  jasmine.Ajax.uninstall();
});

//in your tests
expect(jasmine.Ajax.requests.mostRecent().url).toBe('/some/cool/url');
于 2016-01-21T01:57:17.020 に答える