[英]Nodejs Unit Testing Urls
增量執行此操作的最佳方法是什么? 例如。 必須先訪問某些URL才能填充數據庫等。某些單元測試是否有慣用的節點方法?
我目前從json文件中讀取單元測試數據,然后基於該請求。
function urlTestFn(test){
var req = requestProperties(test);
var request = http.request(req, function(resp) {
resp.setEncoding('utf8');
resp.on('data',function(data) {
if(data == JSON.stringify(test.response)) {
//success
} else {
sys.puts('fail');
}
});
});
if(req.method == 'POST'){
request.write(JSON.stringify(test.postData));
}
request.end();
}
要補充Peter Lynos的建議,請允許我向您介紹單元測試的正確概念。 執行單元測試時,很多人會問錯問題。 不是“我如何測試”,而是“我要測試什么”。 就您而言,您想測試您的代碼,邏輯,而不要測試其他任何東西。 這意味着您必須刪除所有外部因素,包括第三方庫,npm模塊,甚至是node.js核心API模塊。
問問自己-您是否可以復制測試套件並運行它而無需花費數小時來設置環境? 你應該能夠。 這就是編寫單元測試的全部要點-使其獨立運行以確保您的代碼正確。 我們稱您的代碼可以獨立運行的“環境”為“控制環境”,類似於科學界使用的相同術語。
現在要實現這一點,您需要了解固定裝置和模擬裝置的概念。 可以使用夾具來創建您的控制環境。 它是通過創建一堆模擬對象來實現的,每個模擬對象都接受一個輸入並產生一個輸出。 這樣,您就可以完全控制代碼的各個方面,這使得測試從DB操作到REST請求的所有內容變得非常簡單。
最后,了解到:
模擬對象
假設您要在函數foo()中讀取文件的內容,則模擬結果如下所示:
var FsMock = {
readFile : function readFile(path, encoding, callback) {
if (path === 'unit-test-1')
callback(null, 'This is the file contents');
else
callback(new Error('Unexpected error');
}
}
然后在測試代碼中,嘗試讀取文件“ unit-test-1”,它將返回“ This is the file contents”。
依賴注入
如果您的項目未編寫為從外部注入其依賴項,則上述所有內容將非常困難。 現在,我的約定是所有模塊都必須具有make()函數,該函數接受包含其所有依賴項的對象。 這是一個簡單的例子:
var Fs = null;
var Path = null;
var TestObj = module.exports = {
make : function make(args) {
if ('undefined' === typeof args.fs)
throw new Error('Dependency: FS module needed');
if ('undefined' === typeof args.path)
throw new Error('Dependency: Path module needed');
Fs = args.fs;
Path = args.fs;
return Object.create(this);
}
}
然后,您需要一個工廠或一個DI容器來為您構建該對象,並自動構建其依賴關系。
只有這樣,BDD和TDD才能在您的項目中變得有趣。 希望這可以幫助!
好的,一些技巧。 您的代碼似乎根本沒有使用任何測試框架,因此請至少查看使用commonJS斷言或測試框架。 我更喜歡茉莉花 ,但是有幾個很好的。 Jasmine對間諜程序和異步測試提供了強大的支持。 附帶說明一下,這些不是單元測試,從定義上講不會打入數據庫,它們很可能是應用程序/系統測試。 除了這些通過整個堆棧發送實時數據的系統級測試之外,您可能還想考慮為服務器端代碼編寫一些純單元測試。
關於測試先決條件的主題,通常嘗試使每個測試盡可能獨立。 但是,當無法避免完全獨立時,大多數單元測試框架都有一個“ setup
/ teardown
”功能對的概念,這些功能在每次測試之前和之后都被調用。 在jasmine中 ,這是beforeEach
函數。 有時在Rails社區中將數據庫對象預加載為“夾具”。 還有“工廠”的概念。 每種策略都有優點和缺點。 我不確定是否有用於工廠或固定裝置的節點庫,但可以進行網絡搜索。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.