2013-04-28 73 views
1

我用express寫了一個簡單的JSON API,我試圖用摩卡做一些黑盒測試。通過測試API需要以不同的用戶身份進行身份驗證,因此每個針對特定功能的測試都至少包含兩個請求:登錄操作以及測試實際功能的一個或多個已驗證請求。用於測試Express應用程序的狀態交互

我還沒有找到任何類似於django.test.client的庫來模擬HTTP客戶端和服務器之間的有狀態交互。 Supertest似乎很受歡迎,但與django測試客戶端相比,它非常低級。這是我會怎麼寫它一個簡單的驗證測試(請原諒我的CoffeeScript):

it 'should return a 200 OK', (done) -> 
    supertest(server.app) 
    .post('/login') 
    .send("username=xxx&password=pass") 
    .end (err, res) -> 
     res.should.have.status(200) 
     supertest(server.app) 
     .get('/api/users') 
     .set('cookie', res.headers['set-cookie'][0]) 
     .expect(200, done) 

這真的執行的交互最徹底的方法?有什麼圖書館可以幫助我解決異步問題(這不是我需要的東西,而是99%的案例中的測試的簡單序列化,回調只是混淆)和有狀態?東西會是這樣的:

it 'should rock', (done) -> myCoolLibrary [ 
    -> 
    @post '/login', {username: "xxx", password: "pass"}, (err, res) => 
     res.should.have.status 200 
     @done() 
    , 
    -> 
    @get '/api/users', (err, res) => 
     res.should.have.status 200 
     @done() 
    ] 

如果沒有類似的存在,我應該自己寫:-) 上下文的依賴是因爲我使用了太多ZappaJS這些天,並感謝CoffeeScript中的脂肪箭頭,它根本不是一個不好的成語。

回答

0

作爲使異步代碼更清晰可讀的更通用的解決方案,請查看異步。 https://github.com/caolan/async

async.serial會正好滿足您的需求,但我會特別推薦async.auto,它允許您以清晰的方式將各種步驟與其依賴關係鏈接在一起。

+0

以前版本帖子中有一些內容「這看起來很像async.series,這不是巧合」。我應該把它留在那裏:-)很顯然,node.js並不缺少任何構建塊,而是來自一個更龐大的整體框架,我覺得發現和學習10個模塊非常繁瑣,只是爲了做一些如此簡單的事情。我最終自己寫了一個非常特定於Zappa的實現,我會在某處發佈它。 – BruceBerry 2013-04-29 22:05:18

+0

節點生態系統就像Perl一樣:有多種方式可以實現它。您花費大量時間評估潛在的模塊選項。 – dankohn 2013-04-30 01:05:08

1

聽起來好像你可以從zombiejs中受益。它模擬瀏覽器並在請求之間保存cookie和會話數據。

它還爲您提供更強大的功能,例如允許您填寫表單並提交它們。

典型的測試將是這個樣子:

var Browser = require('zombie') 
    , browser = new Browser({site:'http://yoursite.com'}); 
describe('page',function(){ 
    before(function(done){ 
     browser.visit('/loginpage',done); 
    }); 
    it('should return a 200 page',function(done){ 
     browser.fill('username','xxx'); 
     browser.fill('password','pass'); 
     //assuming your form points to /login 
     browser.pressButton('button[type="submit"]'),function(){ 
      assert(browser.success); //status code is 2xx 
     }).then(done,done); //call the done handler after promise is fulfilled 
    }); 
    it('should rock',function(done){ 
     browser.visit('/api/users',function(){ 
      assert(browser.success); 
     }).then(done,done); 
    }); 
0

我結束了自己寫一個小圖書館,這是非常接近我的「理想」的例子在問題。它不值得自己的包了,所以我只是把它放在一個要點:

https://gist.github.com/BruceBerry/5485917

我無法得到的SuperAgent和supertest執行狀態的互動,所以我就拋棄他們贊成的請求。主要的區別似乎是你不能鏈接期望,你必須在回調中做所有的測試,但是如果你已經在使用另一個測試庫,例如should.js