2012-07-07 55 views
4

我寫的終端到終端的測試與casperjs,想假AJAX服務器響應僞造的XMLHttpRequest與casperjs

我已經想出了包括一個簡單的腳本嘲笑XMLHttpRequest對象的想法,總是返回我的預期的結果,像下面

var ajax_requests = [ 
    ['GET', '/jobs', JSON.stringify(jobs)] 
], stubs = stubs || {}; 

function setup_ajax(){ 
    stubs.server = sinon.fakeServer.create(); 
    _.each(ajax_requests, function(r){ 
     //r[1] = "http://localhost:8000" + r[1] 
     r[2] = [200, { "Content-Type": "application/json" }, r[2]] 
     stubs.server.respondWith.apply(stubs.server, r) 
    }) 
    stubs.server.autoRespond = true; 
    stubs.server.autoRespondAfter = 2; 
} 

然後我打電話setup_ajax在我的卡斯帕測試樣

casper.then(function(){ 
    this.evaluate(setup_ajax) 
} 

但似乎未來阿賈克斯請求仍然避免我的xmlhttprequest實現。

我試過在飛行運行setup_ajax,使用$。就緒(),並具有從卡斯帕叫過,但這些都不曾

更有趣的是,檢查對象的存在奇怪的失敗。

function setup_ajax(){ 
    return typeof(sinon) 
} 

casper.then(function(){ 
    var x = this.evaluate(setup_ajax) 
    casper.log(x) // logs 'null' 
} 

但興農正確包括,至少卡斯帕當我做了setup_ajax功能以外的一些調用它,但是當我故意曾興農排除導致錯誤沒有造成任何錯誤。

對casperjs下的mocking xmlhttprequests有什麼建議嗎?

回答

4

您可以使用sinon.js來僞造XmlHttpRequest。

+0

完成請求正是這就是我嘗試使用,你可以給你會怎麼做更詳細的說明,請爲我的方法(如上文所述)不能正常工作 – Akasha 2012-07-07 19:55:04

+0

實際上,這是我的casperjs命令: $ casperjs test --direct --log-level = debug --includes = public/js/libs/jquery.js,public/js/libs/underscore-min.js,test /stubs/sinon-1.3.4.js,test/stubs/ajax_requests.js測試/前端/ jobs.js 你可以看到應該如何包含libs。 – Akasha 2012-07-07 20:05:48

+4

'--includes' cli參數不接受客戶端目標庫;它只是提供一種方便的方式來加載在phantomjs環境中使用的通用腳本 - 而不是在遠程DOM中。 (提示:我是casperjs的作者) – NiKo 2012-07-08 20:14:52

1

PhantomXHR包裝XHR嘲諷SinonJS casperjs。

首先,你需要初始化PhantomXHR:

var xhr = require('phantomxhr'); 
casper.on('page.initialized', function() { 
    xhr.init(casper.page, { 
     libraryRoot: '/path/to/node_modules/phantomxhr/' 
    }); 
}); 

比你可以僞造XHR請求:

var fake = xhr.fake({ 
    url: '/jobs', 
    responseBody: jobs 
}); 

採取的等待XHR請求評估頁面之前完成護理。您可以檢查是否通過尋找

fake.count() === 1