我有一个utils.js
文件,其中包含一些通用实用程序功能。我使用module.exports
公开了一些功能,而其余功能则保持隐藏。
module.exports = {
utils_1: function_1,
utils_2: function_2
};
假设我不想公开其他功能,即function_3
和function_4
,但是我想用Jasmine进行测试。我目前唯一能做的方法是将它们与其余功能一起暴露,并像往常一样编写我的测试套件。
有没有一种方法可以通过Jasmine测试某些功能而不暴露它们?
我唯一能想到的就是创建一个包含(并暴露)function_3
和function_4
的不同javascript文件,要求将其放在我的utils.js
中,并同时测试Jasmine创建新文件,但这会将我的原始文件一分为二(所有其他类似文件也一样)。
答案 0 :(得分:3)
function_3
和function_4
在function_1
和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);
});
});
应该通过,对不对?看到我只测试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
仍可以隐藏)。