如何使用mocha和node.js对私有函数进行单元测试?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (170)

我正在使用mocha来测试为node.js编写的应用程序

我想知道是否可以对未在模块中导出的函数进行单元测试。

我有很多像这样定义的函数 foobar.js

function private_foobar1(){
    ...
}

function private_foobar2(){
    ...
}

和一些作为公众出口的功能:

exports.public_foobar3 = function(){
    ...
}

测试用例的结构如下:

describe("private_foobar1", function() {
    it("should do stuff", function(done) {
        var stuff = foobar.private_foobar1(filter);
        should(stuff).be.ok;
        should(stuff).....

显然这不起作用,因为private_foobar1没有导出。

单元测试私有方法的正确方法是什么?mocha是否有一些内置的方法来做到这一点?

提问于
用户回答回答于

如果该功能未被模块导出,则不能通过模块外的测试代码进行调用。这是由于JavaScript的工作原理,而mocha本身无法绕过这一点。

在少数情况下,我确定测试私有函数是正确的,我所做的是设置一些环境变量,我的模块会检查它是否在测试设置中运行。如果它在测试设置中运行,那么它会导出额外的函数,然后我可以在测试期间调用它。

在这里松散地使用“环境”一词。这可能意味着检查process.env或其他可以与模块通信的其他内容“您现在正在测试”。我不得不这样做的情况是在RequireJS环境中,并且我用于module.config此目的。

用户回答回答于

检查rewire模块。它允许你获取(和操作)模块中的私有变量和函数。

所以在你的情况下,使用会是这样的:

var rewire = require('rewire'),
    foobar = rewire('./foobar'); // Bring your module in with rewire

describe("private_foobar1", function() {

    // Use the special '__get__' accessor to get your private function.
    var private_foobar1 = foobar.__get__('private_foobar1');

    it("should do stuff", function(done) {
        var stuff = private_foobar1(filter);
        should(stuff).be.ok;
        should(stuff).....

扫码关注云+社区

领取腾讯云代金券