2012-01-16 12 views
4

Jasmine BDDを使用してajax呼び出しを偽装する方法の例を見つけるのに苦労していますか?Jasmine BDDを使用してajax関数のスタブを作成する方法

私はそう...

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

のように動作しますカスタムAjaxの機能を持っている...と私は、実際のAjaxの機能を呼び出す偽のスタブを作成する方法は考えてきません。

Ajax関数を呼び出すことは避けたいのですが、サーバーへの実際のAjax呼び出しが応答するのに時間がかかり、テストスイートに多数の仕様がある場合、テストスイートの速度が遅くなる可能性があります。

私はあなたがspyOn(namespace, 'ajax')を使用することができることを聞いたが、それは単にspyOn機能を使用するオブジェクトに私のajax機能をラップするために私を必要とすることがすぐに迷惑である(しかし、関係なく、私は私と一緒に従うことができませんでしたajax呼び出しを偽装するための具体的な例は見つかりませんでした)。

また、createSpy()を使用できると聞いてきましたが、ドキュメントはあまり役に立ちません(どちらもGitHubの対応するwikiではありません)。

スパイを使って偽のajaxコールを作成する方法を説明する助けがあれば幸いです。

答えて

4

fake serverのビルドを持つSinonJSモッキングフレームワークを使用できます。ジャスミンで簡単に使用できます。

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

Btw。あなたのAJAX機能が、なぜ、単一の機能についてspyOn(window, 'ajax')

+0

ありがとうございました。私はすでに昨日自分で作業を開始していました。 Gist:https://gist.github.com/1625810 – Integralist

0

を呼び出すことはありませグローバル名前空間にある場合、あなたは「createSpy」を使用することができます:あなたはそれを再定義したいので

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

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

詳細はthis answerを参照してください。 AJAX呼び出しについて

new docsAsynchronous Support section、またはより良い使用Clockを参照してください。

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(); 
+0

注意すべき重要な点は、 'Clock'モックは' setTimeout'/'setInterval'コールを実際に代用するので、それらは即座に呼び出されるが、このモックはタイムアウトを待つのを防ぐためにのみ行われます –

0

あなたはスパイを使用していないとOKであれば、代わりにアドオンjasmine-ajax。単一スペックの使用withMockのモックするには:あなたがrespondWithを使用する場合

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"}'); 
    }); 
    }); 

応答のみが送信されます。上記のリンクにはインストール方法の説明があります

関連する問題