【问题标题】:faking xmlhttprequests with casperjs [closed]用 casperjs 伪造 xmlhttprequests [关闭]
【发布时间】:2012-07-07 13:20:03
【问题描述】:

我正在使用 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 实现。

我尝试过运行 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 下的 mocking xmlhttprequests 有什么想法吗?

【问题讨论】:

    标签: javascript testing mocking sinon casperjs


    【解决方案1】:

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

    【讨论】:

    • 这正是我尝试使用的方法,您能否更详细地描述一下您将如何做到这一点,因为我的方法(如上所述)不起作用
    • 其实这是我的 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 test/frontend/jobs.js 你可以看到应该如何包含libs。
    • --includes cli 参数不接受客户端目标库;它只是为了提供一种方便的方法来加载要在 phantomjs 环境中使用的通用脚本——而不是在远程 DOM 环境中。 (提示:我是 casperjs 的作者)
    • 我知道您是作者,感谢您的支持。感谢您澄清这一点。
    【解决方案2】:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 2015-02-13
      相关资源
      最近更新 更多