2012-01-16 27 views
4

我很努力地找到關於如何使用Jasmine BDD僞造ajax調用的任何示例?如何使用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調用將不勝感激!

回答

4

您可以使用SinonJS嘲笑框架,該框架的內部構建爲fake server。你可以很容易地使用它與茉莉花:

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

如果你確定有沒有使用間諜,而是在附加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。上面的鏈接有一些方向如何安裝

相關問題