2012-07-07 52 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