Jasmine BDDを使用してajax関数のスタブを作成する方法
-
29-10-2019 - |
質問
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
を使用するときにのみ送信されます。上のリンクにはいくつかの指示があります