4

我正在用 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;
}

然后我打电话给setup_ajax我的 casper 测试

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

但看似未来的 ajax 请求仍然避免我的 xmlhttprequest 实现。

我试过运行 setup_ajax,使用 $.ready() 并从 casper 调用它,但这些都不起作用

更有趣的是,检查对象的存在奇怪地失败了。

function setup_ajax(){
    return typeof(sinon)
}

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

但是 sinon 是正确包含的,至少当我在 setup_ajax 函数之外对其进行一些调用时,casper 没有导致任何错误,但是当我故意排除 sinon 时会导致错误。

您对在 casperjs 下模拟 xmlhttprequests 有什么想法吗?

4

2 回答 2

4

您可以使用sinon.js来伪造 XmlHttpRequest。

于 2012-07-07T18:19:46.933 回答
1

PhantomXHR为 casperjs 包装了 SinonJS 的 XHR 模拟。

首先你需要初始化 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
于 2015-01-13T09:20:38.200 回答