有没有一种方法可以在不暴露Jasmine的情况下对其进行测试?

时间:2019-07-29 09:50:29

标签: node.js jasmine

我有一个utils.js文件,其中包含一些通用实用程序功能。我使用module.exports公开了一些功能,而其余功能则保持隐藏。

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

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

有没有一种方法可以通过Jasmine测试某些功能而不暴露它们?

我唯一能想到的就是创建一个包含(并暴露)function_3function_4的不同javascript文件,要求将其放在我的utils.js中,并同时测试Jasmine创建新文件,但这会将我的原始文件一分为二(所有其他类似文件也一样)。

2 个答案:

答案 0 :(得分:3)

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

应该通过,对不对?看到我只测试function_4,但是,如果我以阻止测试的方式更改function_3的实现,则测试将检测到它。

如果我们将function_3更改为

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

测试将失败。

这是一个可怕的例子,但这只是说明性的。充分利用它。但同样,其他人可能会认为相反,因此会直接采用测试function_3的方法。使用coverage lib查看测试所涵盖的内容。

希望有帮助

答案 1 :(得分:2)

您的私有/未公开函数在导出的函数中使用,不是吗?因此,在您为公共/公开函数编写所有测试用例后,便会对其进行隐式测试。

公开功能或在私有功能上编写测试缺少单元测试的目标:测试公共接口

将私有/未公开的方法视为实现细节。您不应该为这些编写测试,因为私有方法正在抽象实现细节。由于某些内部行为略有变化,导致测试失败变得乏味且过于复杂。

您应该能够立即重构或重写私有函数,但是只要它们满足公共接口的要求,您的测试就将保持绿色。

为您的function_3和function_4创建一个新模块可能很有意义,这取决于它们为您所做的工作。如果我发现自己想在内部进行测试,则表明将其放入具有自己的公共接口的模块中。

因此,我想说您打算将函数移到另一个JavaScript文件中实际上是正确的想法。 (但您可能已经意识到,这里仅需要公开function_3,而function_4仍可以隐藏)。