在单元测试中处理依赖关系的最佳实践Jasmine + Node

时间:2018-03-18 15:26:33

标签: node.js unit-testing dependency-injection jasmine

考虑以下功能(简化,缩短可读性):

function testMe(a)
{
    var request = require('request');
    return new Promise((resolve, reject)=>{
        request.get('someexternalulr?a='+a, (error, response, body) => {
            if (error === null)
            {
                switch(body)
                {
                    case 'one thing':
                        resolve(true);
                    break;
                    case 'something else':
                        reject(whatever);
                    break;
                    // more logic
                }


            }
            else
            {
                reject(error);
            }
        });

    });

}

它调用外部API,应用一些逻辑来分析响应,并返回一个promise。 如果我编写一个jasmine测试,那么每次测试都会调用API,这种测试很好。然而,我有兴趣测试我自己的逻辑,而不是外部API。

测试此类功能的最佳做法是什么?

a)将请求模块的依赖关系作为函数的第二个参数传递?

b)将请求移动到全局变量?

c)其他一些诡计?

1 个答案:

答案 0 :(得分:1)

您需要使用模拟库。 sinon是一个受茉莉花欢迎的图书馆。

const sinon = require('sinon');
const request = require('request');
sinon.stub(request, 'get').yields(null, {}, "<h1>Tarun lalwani</h1>");
const {testMe} = require('./index');

describe("A suite is just a function", function () {
    it("should testMe", function (done) {
        console.log("we are here")
        testMe("tarun").then(data => {
            console.log("data", data);
            done();
        });
    })
});

修改了导出导入功能的代码

module.exports = {
    testMe: function testMe(a) {

        var request = require('request');
        return new Promise((resolve, reject) => {
            request.get('http://vm:8088/?a=' + a, (error, response, body) => {
                console.log("response", error,response,body)
                if (error === null) {
                    switch (body) {
                        case 'some  thing else':
                            reject(whatever);
                            break;
                        case 'one thing':
                            resolve(true)
                            break;
                        default:
                            resolve(body);
                            break;
                    }
                }
                else {
                    reject(error);
                }
            });
        });
    }
}

Results

相关问题