首页 > 解决方案 > 有没有办法用 Jasmine 测试功能而不暴露它们?

问题描述

我有一个utils.js包含一些通用实用程序功能的文件。我module.exports习惯于公开一些功能,而将其余功能隐藏起来。

module.exports = {
utils_1: function_1,
utils_2: function_2
};

假设还有其他功能,即function_3function_4不想公开,但我想用 Jasmine 进行测试。我目前能做到的唯一方法是用其余的功能公开它们并像往常一样编写我的测试套件。

有没有办法通过 Jasmine 测试某些功能而不暴露它们?

我唯一能想到的是创建一个不同的 javascript 文件,其中包含(和公开)function_3function_4,要求在我的文件中utils.js同时使用 Jasmine 测试新文件,但这会将我的原始文件一分为二(并且相同将适用于所有其他类似文件)。

标签: node.jsjasmine

解决方案


function_3andfunction_4里面使用function_1and function_2,对吧?那么,你真的需要对它进行单元测试吗?我不会。但其他人可能会认为相反。

这是我的例子

// utils.js
function function_3(obj) {
  obj.a = 3;
  return obj;
}

function function_4(obj) {
  obj = function_3(obj); // invoke function_3
  obj.b = 4;
  return obj;
}
module.exports = { utils_4: function_4 };

考试:

const { utils_4 } = require('utils');

describe('test 1', () => {
  it('should pass', () => {
    const obj = utils_4 ({});

    expect(obj.a).toBeDefined();
    expect(obj.a).toEqual(3);

    expect(obj.b).toBeDefined();
    expect(obj.b).toEqual(4);
  });
});

应该会过去的吧?看到我只 test function_4,但是,如果我function_3以某种方式改变了我的测试的实现,测试会检测到它。

如果我们function_3改为

function function_3(obj) {
  obj.c = 3;
  return obj;
}

测试将失败。

这是一个糟糕的例子,但它只是说明性的。把它的好部分。但同样,其他人可能会有相反的想法,并会采用function_3直接测试的方法。使用覆盖库来查看测试覆盖的内容。

希望能帮助到你


推荐阅读