使用摩卡和节点对私有函数进行单元测试.js

我正在使用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

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


答案 1

检查重新布线模块。它允许您获取(和操作)模块中的私有变量和函数。

因此,在您的情况下,用法将如下所示:

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).....

答案 2

如果模块未导出函数,则模块外部的测试代码无法调用该函数。这是由于JavaScript的工作方式,Mocha本身无法规避这一点。

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

“环境”一词在这里被松散地使用。这可能意味着检查或其他可以与模块通信的东西“你现在正在接受测试”。我必须这样做的实例是在 RequireJS 环境中,我已经用于此目的。process.envmodule.config