簡體   English   中英

Node.js單元測試

[英]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請求的所有內容變得非常簡單。

最后,了解到:

  1. 最好的測試套件是可以在隔離的控制環境中運行的套件
  2. 夾具用於通過為代碼提供模擬對象來創建該環境
  3. 模擬對象接受輸入並返回輸出
  4. 僅當您使用100%注入依賴項對項目進行編碼時,才能實現上述三件事

模擬對象

假設您要在函數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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM