2011-03-27 70 views
3

我正在嘗試使用node.js學習TDD。我已經遇到了這個問題,其中expresso命令掛起,我認爲是因爲redis服務器。用ctrl+C殺死進程最終會提供我正在尋找的輸出(100%3測試通過)。用expresso - redis會話存儲測試node.js

什麼原因導致expresso命令掛起,我能做些什麼?

我的應用程序是這樣的:

// Module dependencies. 

var auth = require('connect-auth'), 
    RedisStore = require('connect-redis'); 


var express = require('express'); 
var app = module.exports = express.createServer(); 

// Configuration 

app.configure(function(){ 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(express.cookieParser()); 
    app.use(express.session({ store: new RedisStore, secret: "secret goes here" })); 
    app.use(app.router); 
    app.use(express.static(__dirname + '/public')); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
}); 

app.configure('production', function(){ 
    app.use(express.errorHandler()); 
}); 

// Routes 

app.get('/', function(req, res){ 
    res.render('index', { 
    title: 'Orchestrate' 
    }); 
}); 

app.get('/login', function(req, res){ 
    res.render('user/login', { 
    title: 'Login' 
    }); 
}); 

app.get('/register', function(req, res){ 
    res.render('user/login', { 
    title: 'Register' 
    }); 
}); 

// Only listen on $ node app.js 

if (!module.parent) { 
    app.listen(3000); 
    console.log("Express server listening on port %d", app.address().port); 
} 

而且我的測試:

// Run $ expresso 

/** 
* Module dependencies. 
*/ 

var app = require('../app'), 
    assert = require('assert'); 


module.exports = { 
    'GET /': function(){ 
    assert.response(app, 
     { url: '/' }, 
     { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' }}, 
     function(res){ 
     assert.includes(res.body, '<title>Orchestrate</title>'); 
     }); 
    }, 
    'GET /login': function(){ 
    assert.response(app, 
     { url: '/login' }, 
     { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' }}, 
     function(res){ 
     assert.includes(res.body, '<title>Login</title>'); 
     }); 
    }, 
    'GET /register': function(){ 
    assert.response(app, 
     { url: '/register' }, 
     { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' }}, 
     function(res){ 
     assert.includes(res.body, '<title>Register</title>'); 
     }); 
    } 

};

回答

4

試着寫你的測試,如這和測試運行應該自行終止時,所有的測試已經完成:

'GET /': function(done){ 
    assert.response(app, 
     { url: '/' }, 
     { status: 200, headers: { 'Content-Type': 'text/html; charset=utf-8' }}, 
     function(res){ 
     assert.includes(res.body, '<title>Orchestrate</title>'); 

     done(); 
     }); 
+0

done()函數來自哪裏?它有什麼作用? – clyfe 2011-07-16 07:39:00

+0

哦,算出來,它是參數。 – clyfe 2011-07-16 08:50:55

+0

在expresso文檔中,它是'beforeExit',並且執行其他操作... – clyfe 2011-07-16 08:56:52

1

問題是斷言在異步調用後打印。你的測試不會因爲連接重新被掛起,他們只是不知道你所有的測試何時通過。

+0

我雖然它是連接redis,因爲這是我改變之前expresso開始掛。 這是我應該擔心的事情,還是繼續用ctrl + c(任何解決方案?)繼續殺死它 – DanS 2011-03-28 10:52:43

1

我有同樣的問題與

mongoose.connect(); 

快報測試作爲終止預計只要我不連接到數據庫,否則我需要殺死進程才能看到結果。

+0

我有同樣的問題 - 運行涉及數據庫的測試時,測試不會終止並掛起。任何改變? – 2011-04-20 16:42:31

+0

我也有同樣的問題! – 2011-11-15 17:34:33

3

答案是,Mongoose不會很好地關閉連接,這在使用expresso時會導致問題。

您需要添加一個「mongoose.disconnect()」,例如,我總是在最後添加'拆卸'步驟:

tearDown: function(done){ 
     mongoose.disconnect(); 
     done(); 
    } 

希望有所幫助。

+0

Expresso中沒有拆卸/設置功能(如果您在測試中創建了tearDown函數,它將以任何其他測試順序與其他測試一起運行)。無論如何,我投了這個答案,因爲,也爲Redis,你需要結束()客戶端或測試套件不會退出。 – Claudio 2011-07-21 13:18:53

0

對於將來遇到這個問題的人來說,看起來Expresso的繼任者叫做Mocha可以解決這個問題。它支持真正的初始化和拆卸功能,以及一個完成()回調修復異步完成問題。