Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 有没有一种方法可以用Jasmine测试函数而不暴露它们?_Node.js_Jasmine - Fatal编程技术网

Node.js 有没有一种方法可以用Jasmine测试函数而不暴露它们?

Node.js 有没有一种方法可以用Jasmine测试函数而不暴露它们?,node.js,jasmine,Node.js,Jasmine,我有一个utils.js文件,其中包含一些通用实用程序函数。我使用module.exports公开一些函数,同时隐藏其余函数 module.exports = { utils_1: function_1, utils_2: function_2 }; 假设还有其他函数,即function\u3和function\u4,我不想公开,但我想用Jasmine进行测试。目前我唯一能做到这一点的方法是将它们与其他函数一起公开,并像往常一样编写测试套件 有没有一种方法可以在不公开的情况下通过Jasmine

我有一个
utils.js
文件,其中包含一些通用实用程序函数。我使用
module.exports
公开一些函数,同时隐藏其余函数

module.exports = {
utils_1: function_1,
utils_2: function_2
};
假设还有其他函数,即
function\u3
function\u4
,我不想公开,但我想用Jasmine进行测试。目前我唯一能做到这一点的方法是将它们与其他函数一起公开,并像往常一样编写测试套件

有没有一种方法可以在不公开的情况下通过Jasmine测试某些功能


我能想到的唯一一件事是创建一个不同的javascript文件,其中包含(并公开)
function_3
function_4
,在我的
utils.js
中要求该文件,同时用Jasmine测试新文件,但这会将我的原始文件一分为二(同样的情况也适用于所有其他类似文件).

功能单元3
功能单元4
功能单元1
功能单元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);
  });
});
它应该通过,对吗?请注意,我只测试
函数_4
,但是,如果我以停止测试的方式更改
函数_3
的实现,测试将检测到它

如果我们将
功能_3
更改为

function function_3(obj) {
  obj.c = 3;
  return obj;
}
考试将失败

这是一个糟糕的例子,但它只是说明问题。从中得到好处。但同样,其他人可能会持相反的想法,并会采用直接测试
函数3
的方法。使用覆盖率库查看测试覆盖的内容


希望对您有所帮助

您的私有/未公开函数在导出函数中使用,不是吗?因此,当您为公共/公开函数编写所有测试用例时,就会隐式地测试它们

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

将私有/未公开的方法视为实现细节。您不应该为它们编写测试,因为私有方法正在抽象实现细节。由于一些内部行为发生了轻微的变化,让测试中断变得单调而复杂

您应该能够随心所欲地重构或重写私有函数,但只要它们实现了公共接口,您的测试就会保持绿色

为函数_3和函数_4创建一个新模块可能有意义,具体取决于它们为您所做的工作。如果我发现,我想在内部测试一些东西,这是一个标志,使它成为自己的模块,有自己的公共接口

所以我想说,将函数移动到另一个JavaScript文件中实际上是正确的想法。(但您可能会意识到,这里只需要公开
函数3
,而
函数4
仍然可以隐藏)