在Mocha中测试一个请求调用的函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在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中模拟它?

答案

如果你想用mocha创建mock或stubs,你需要使用一些模块。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文档来学习如何测试不同的请求和响应。

以上是关于在Mocha中测试一个请求调用的函数的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 supertest 和 agent 在 mocha 测试中发出经过身份验证的请求?

在mocha测试中调用异步函数如何避免超时错误:超过2000ms的超时

如何从 mocha/superagent 测试对 amazon-s3 的 CORS 上传调用?

如何检查请求是不是使用 JavaScript (Mocha) 发送

Mocha Chai 基本 GET 请求未正确记录通过和失败

Mocha/Sinon 测试猫鼬里面的快递