2013-07-19 79 views
4

我如何使用Sinon與CasperJS?這是基本的測試文件我使用:如何使用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在全球和本地安裝,並且確實需要線路在節點交互模式下正常工作。

有人可以張貼或指向我的一個例子,其中Sinon與CasperJS一起使用的方向?它並不特別需要做ajax嘲弄。任何用法都可以。

回答

5

那麼這裏有很多問題。首先,你試圖要求sinon就像它在節點中的工作方式一樣,但它不能在casper中工作,因爲casper不關心你是否有node_modules目錄,也不會關注它。我假設你已經在你的node_modules目錄中安裝興農,所以你應該這樣做:

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

的技巧是,你只能使用相對路徑得到安裝在node_modules模塊,因爲卡斯帕有沒有這樣的事情作爲解析node_modules目錄。

接下來的一部分你做錯了,好像你在幻燈片方和客戶端之間感到困惑。您在上面的腳本在phantomjs一側進行評估,並且包含在html中的腳本在客戶端進行評估。這兩個,不要相互分享任何記憶,全局對象是不同的。所以,你不能這樣做在phantomjs側sinon.fakeServer.create();,因爲它試圖創建一個假XMLHttpRequest,但這並不在phantomjs上存在,它存在於客戶端。所以在技術上你不需要在這裏運行它。

所以,你需要做的是,評估客戶端興農模塊,並評估你有沒有在客戶端腳本。

這給我們帶來了下面的代碼:

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');,因爲並不需要它了,因爲我們正在評估在客戶端興農。