【问题标题】:How to use Sinon with CasperJS?如何在 CasperJS 中使用 Sinon?
【发布时间】:2013-07-19 01:56:40
【问题描述】:

如何在 CasperJS 中使用 Sinon?这是我正在使用的基本测试文件:

var url = 'http://localhost:3000/';

var sinon = require('sinon');
var server = sinon.fakeServer.create();

server.respondWith("GET", "/login",
    [200, { "Content-Type": "application/json" },'{"id": 12}']);

casper.test.begin('integration',1,function suite(test){
  casper.start(url,function start(){
    test.assertHttpStatus(200,'http status is 200');
  });

  casper.run(function run(){
    test.done();
  });
});

那么这个脚本是这样调用的:

casperjs test integration.js

这是版本信息:

CasperJS version 1.1.0-DEV
at /usr/local/Cellar/casperjs/1/libexec,
using phantomjs version 1.9.1

下一步是填写登录模式并提交,这将执行 ajax 查询。我想模拟 jQuery 的 $.ajax 方法。问题是我收到此错误:“CasperError: Can't find module sinon”。但是 Sinon 是在全局和本地安装的,并且确切的 require 行在节点交互模式下工作正常。

有人可以发帖或指出一个将 Sinon 与 CasperJS 一起使用的示例的方向吗?它不需要专门做 ajax 模拟。任何用法都可以。

【问题讨论】:

    标签: phantomjs require casperjs sinon


    【解决方案1】:

    那里有多个问题。首先,您尝试要求 sinon 就像它在 node 中的工作方式一样,但它在 casper 中不起作用,因为 casper 不在乎您是否有 node_modules 目录,并且它不会调查它。我假设你已经在你的 node_modules 目录中安装了 sinon,所以你应该这样做:

    var sinon = require('./node_modules/sinon');
    

    诀窍在于,您只能使用 相对 路径来获取安装在 node_modules 中的模块,因为对于 casper,没有解析 node_modules 目录之类的东西。

    您做错的下一部分,似乎您在 phantomjs 端和客户端之间感到困惑。您在上面的脚本在 phantomjs 端进行评估,并且 html 中包含的脚本在客户端进行评估。这两个,互不共享任何内存,全局对象不同。所以你不能在phantomjs端做sinon.fakeServer.create();,因为它试图创建一个假的XMLHttpRequest,但这并不存在于phantomjs端,它存在于客户端。所以从技术上讲,你不需要在这里运行它。

    所以你需要做的是在客户端评估 sinon 模块并评估你在客户端的脚本。

    这将我们带到以下代码:

    var url = 'http://localhost:3000/';
    
    // Patch the require as described in
    // http://docs.casperjs.org/en/latest/writing_modules.html#writing-casperjs-modules
    var require = patchRequire(require);
    var casper = require('casper').create({
      clientScripts:  [
        // The paths have to be relative to the directory that you run the
        // script from, this might be tricky to get it right, so play with it
        // and try different relative paths so you get it right
        'node_modules/sinon/pkg/sinon.js',
        'node_modules/sinon/pkg/sinon-server-1.7.3.js'
      ]
    });
    
    casper.test.begin('integration',1,function suite(test){
      casper.start(url,function start(){
        test.assertHttpStatus(200,'http status is 200');
        casper.evalute(function () {
          var server = sinon.fakeServer.create()
          server.respondWith("GET", "/login",
            [200, { "Content-Type": "application/json" },'{"id": 12}']);
        });
      });
    
      casper.run(function run(){
        test.done();
      });
    });
    

    请注意,我没有包含对 var sinon = require('./node_modules/sinon'); 的调用,因为我们正在客户端评估 sinon,因此不再需要它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      • 2022-11-14
      • 2015-07-15
      • 1970-01-01
      相关资源
      最近更新 更多