簡體   English   中英

在 Mocha 中使用請求調用測試函數

[英]Testing a function with request call in Mocha

我對 node.js 和 Mocha 很陌生。 我想測試以下功能:

querybackend = function(url,queryParams) {
    var backendData ={};
    request({url:url, qs:queryParams}, function(err, response, body) {
        if(err) { console.log(err); return; }
        var data = JSON.parse(body);
        var length = data.length;
        var tmp = data[0].DataPoints[0].length;
        var in_sum =Array.apply(null, new Array(tmp)).map(Number.prototype.valueOf,0);
        var timestamp = [];
        var index1;
        var index2;
        for(index1=0;index1 < length;index1++) {
            var length2=data[index1].DataPoints.length;
            for(index2=0;index2<length2;index2++) {
                in_sum[index2]= in_sum[index2] + data[index1].DataPoints[index2][1];
                timestamp[index2] = data[index1].DataPoints[index2][0];
            }
        }
        backendData.count = in_sum;
        backendData.timestamp  = timestamp;
        deferred.resolve(backendData);
    });
    return deferred.promise;
};

測試此功能的正確方法是什么? 這個函數到達一個休息端點,獲取一個 JSON,解析它並返回一個對象。

這是我得到的示例 JSON:

[
    {
        "Name": "name1",
        "DataPoints": [
            [
                1410627915,
                242221
            ]
        ]
    },
    {
        "Name": "name2",
        "DataPoints": [
            [
                1410627913,
                238157
            ]
        ]
    },
    {
        "Name": "name3",
        "DataPoints": [
            [
                1410627922,
                215045
            ]
        ]
    }
] 

我應該嘲笑這個請求嗎? 我如何在摩卡中模擬它?

如果你想用 mocha 創建模擬或存根,你需要使用一些模塊。 Sinon.js ( http://sinonjs.org/ ) 是一個很棒的,很容易使用並且有很好的文檔記錄。

我認為您應該模擬請求函數以使用您的休息端點應該發送給您的答案來調用回調函數。

然后,您可以測試您的功能應該做的所有事情是否都已正確完成。 順便說一句,如果你想測試一個函數是否被調用,你可以用 sinon 對這個函數創建一個間諜。

我發現使用nock來接收請求並返回 API 應該返回的任何內容更方便。

通過這種方式,您還可以檢查不同的測試用例,如果函數優雅地處理 404 或 502 等錯誤響應。

簡單示例:

describe( 'querybackend', function () {

    it( 'should request the passed in URL', async function () {

        // Intercept requests to https://example.org/ and reply with HTTP 200 code 
        const scope = nock( 'https://example.org' )
            .get( '/' )
            .reply( 200 );

        // Call the function we are testing
        await querybackend( 'https://example.org/' );

        // Make sure the nock scope was properly called
        scope.done();

    } );

} );

我建議通讀 nock 文檔以了解如何測試不同的請求和響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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