如何在CasperJS上使用Sinon?

时间:2013-07-19 01:56:40

标签: phantomjs require casperjs sinon

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

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:找不到模块sinon ”。但是Sinon是在全局和本地安装的,并且确切地说要求行在节点交互模式下工作正常。

有人可以发帖或指出我在与CasperJS一起使用Sinon的例子的方向吗?它没有特别要做ajax嘲笑。任何用法都没问题。

1 个答案:

答案 0 :(得分:5)

那里有很多问题。首先,您试图要求sinon像它在节点中的工作方式一样,但它在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时不再需要它。