質問

Jasmine BDD を使用して ajax 呼び出しを偽装する方法の例を見つけるのに苦労しています。

次のように動作するカスタム ajax 関数があります...

ajax({
    url: 'JSON.php',
    dataType: 'json',           
    onSuccess: function(resp) {
        console.log(resp);
    }
});

...実際の ajax 関数の呼び出しを偽装するスタブを作成する方法がわかりません。

サーバーへの実際の ajax 呼び出しの応答に時間がかかり、テスト スイートに大量の仕様がある場合、テスト スイートの速度が低下する可能性があるため、ajax 関数の呼び出しは避けたいと考えています。

使えると聞きました spyOn(namespace, 'ajax') しかし、それは私がラップする必要があるのですぐに面倒です ajax を使用するためだけにオブジェクト内の関数 spyOn 関数 (ただし、ajax 呼び出しを偽装する具体的な例が見つからなかったため、理解できませんでした)。

使えるという話も聞きました createSpy() しかし、やはりドキュメントはあまり役に立ちません (GitHub 上の対応する Wiki も役に立ちません)。

スパイを使用して偽の ajax 呼び出しを作成する方法について説明していただければ、大変助かります。

役に立ちましたか?

解決

偽のサーバーを構築するSinonjs Mocking Frameworkを使用できます。あなたは簡単にジャスミンと一緒に使うことができます:

beforeEach(function() {
        server = sinon.fakeServer.create();
        server.respondWith([200, { "Content-Type": "text/html", "Content-Length": 2 }, "OK"])
});
.

btw。AJAX機能がGlobal Namespaceにある場合は、spyOn(window, 'ajax') を呼び出さないのです。

他のヒント

単一の関数に関しては、「createSpy」を使用できます。

/*var */ajax = createSpy('foo');

var 再定義したいので存在しませんが、このスパイを定義するブロックが実際のスコープと同じスコープにバインドされている必要があります。 ajax と定義されました。または、それと混同した場合は、次を使用します spyOn(window, foo), なぜなら、とにかくブラウザでテストしているからです。

見る この答え 詳細については。

ajax 呼び出しについては、次を参照してください。 非同期サポート セクション新しいドキュメント, 、またはより良い使用 時計:

window.ajax = function() {};

var response;

var ajaxSpy = spyOn(window, 'ajax').andCallFake(function(url, callback) {
   setTimeout(function() { callback({ 'foo': 'bar' }); }, 1000);
});

jasmine.Clock.useMock();

function callback(resp) { response = resp;  }

ajax('fake.url', callback);

jasmine.Clock.tick(1500);

expect(ajaxSpy).toHaveBeenCalled();
expect(response).toBeDefined();
expect(response.foo).toBeDefined();

スパイを使用しないで、代わりにアドオン jasmine-ajax。単一の仕様を使用するためにwithMock

  it("allows use in a single spec", function() {
    var onSuccess = jasmine.createSpy('success');
    jasmine.Ajax.withMock(function() {
      ajax({
            url: 'JSON.php',
            dataType: 'json',           
            onSuccess: onSuccess
      });
      expect(onSuccess).not.toHaveBeenCalled();

      jasmine.Ajax.requests.mostRecent().respondWith({
        "status": 200,
        "responseText": '{"some": "json"}'
      });

      expect(onSuccess).toHaveBeenCalledWith('{"some": "json"}');
    });
  });
.

応答はrespondWithを使用するときにのみ送信されます。上のリンクにはいくつかの指示があります

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top