2013-03-16 98 views
3

我正在使用Express.js 2.5.8。爲了減少重複,我正在尋找使用dynamicHelper將常用對象傳遞給視圖,而無需在每個路徑中明確呈現它們。快速響應本地化測試

我已經看到了截取當地人的方法來源視圖的來源,但沒有太多的成功。我可以通過檢查app.dynamicViewHelpers對象來確認它們的存在。但是,我想知道是否有實現這一點的實現依賴性較少的方式。

理想的解決方案是不知道值和對象是如何傳遞給視圖的。無論他們來自何種瀏覽者,中間件或路由本身,測試都應該通過而不需要修改。無論如何,這是理想的。我會解決其他方法。

的我正在尋找測試A寬鬆例如:

app.dynamicHelpers({ 
    example : function(req, res){ 
    return "Example Value"; 
    } 
}); 

app.get('/example', function(req, res){ 
    res.render('example-view', { 
    sample : "Sample Value" 
    }); 
}); 

// test that example === "Example Value" in the view 
// test that sample === "Sample Value" in the view 
+1

你能爲你正在嘗試做提供了一個小例子場景?我不明白爲什麼你不能寫一些東西來包裝包含附加數據的模板插件。 – Brad 2013-03-16 23:41:25

+0

@布拉德我不確定你在暗示什麼。這會成爲測試的一部分,還是生產代碼的一部分? – jneander 2013-03-16 23:58:40

+0

我現在明白了。不知怎的,在我第一次讀到你的問題時,我完全錯過了「測試」部分。 – Brad 2013-03-17 00:02:00

回答

0

這是一個真正偉大的問題。我認爲最好的辦法是通過快速查看系統。如果使用的是快遞2,它可能看起來如下:

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

express.view.compile = function (view, cache, cid, options) { 
    // This is where you get the options as passed to the view 
    console.log(options); 

    return { 
    fn: function() {} 
    }; 
}; 

app.locals({ 
    passed_via_locals: 'value' 
}); 

app.get('/', function (req, res, next) { 
    res.render('index', { 
    passed_in_render: 'value', 
    layout: false 
    }); 
}); 

app.listen('./socket'); 

var http = require('http'); 

http.get({socketPath: './socket'}); 

快遞3,這變得更加容易:

var express = require('express'); 
var app = new express(); 

function View() { 
    this.path = true; 
}; 
View.prototype.render = function(options, cb) { 
    // This is where you get the options as passed to the view 
    console.log(options); 
}; 
app.set('view', View); 

app.locals({ 
    passed_via_locals: 'value' 
}); 

app.render('index', { 
    passed_in_render: 'value' 
});