【问题标题】:Best practice in handling dependencies in unit tests Jasmine + Node处理单元测试中依赖关系的最佳实践 Jasmine + Node
【发布时间】:2018-08-27 05:25:46
【问题描述】:

考虑以下函数(为便于阅读而简化、缩短):

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) 还有什么诡计?

【问题讨论】:

  • 在写这篇文章时,我意识到我的问题有两个部分。一是如何mock外部依赖,二是如何mock API响应。

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


【解决方案1】:

您需要为此使用模拟库。 sinon 是一个流行的 jasmine 库。

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);
                }
            });
        });
    }
}

【讨论】:

    猜你喜欢
    • 2010-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2022-08-09
    相关资源
    最近更新 更多