我正在使用casperjs编写端到端测试,并想伪造ajax服务器响应
我想出了一个包含一个简单脚本的想法,该脚本模拟了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;
}
然后我在我的casper测试中调用setup_ajax
,如
casper.then(function(){
this.evaluate(setup_ajax)
}
但看似未来的ajax请求仍然避免我的xmlhttprequest实现。
我已经尝试使用$ .ready()动态运行setup_ajax并从casper调用它,但这些都不起作用
更有趣的是,检查对象的存在奇怪地失败了。
function setup_ajax(){
return typeof(sinon)
}
casper.then(function(){
var x = this.evaluate(setup_ajax)
casper.log(x) // logs 'null'
}
但是sinon被正确包含在内,至少casper在我在setup_ajax函数之外调用它时没有引起任何错误,但是当我故意将sinon排除在外时会导致错误。
您对在casperjs下模拟xmlhttprequests有什么想法吗?
答案 0 :(得分:4)
您可以使用sinon.js伪造XmlHttpRequest。
答案 1 :(得分:1)
PhantomXHR包含了针对casperjs的XHR模拟SinonJS。
首先你需要初始化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