【问题标题】:Sinon.js stub an anonymous function inside an objectSinon.js 存根对象内的匿名函数
【发布时间】:2016-10-03 15:06:21
【问题描述】:

所以我正在对我的代码进行单元测试,但在测试一个在我正在单元测试的函数内部调用的匿名函数时遇到了问题。 我之所以没有将匿名函数设为一个名为函数的实例,是因为我需要封闭单元测试函数中的一些变量才能在匿名函数内部使用。 举例说明:

function funcBeingTested(done, arg1) {
    var self = this; 
    ...
    self.array.push({
        "arguments": [
            "x", "y", function (error, result) {
                // do some stuff with arg1...
                done(error, arg1);
            }, "z"
        ]
    });
    ...
    self.run(); // Eventually will call the anonymous function above from 'self.array'
}

现在,我的问题是有没有办法使用 sinon.js 测试该匿名函数内部发生了什么?
作为funcBeingTested() 单元测试的一部分,我可以使用特定参数调用它?

编辑: 为了消除对我想要实现的目标的任何误解, 我希望能够自行对 匿名函数 进行单元测试并覆盖所有可能的分支以获得 100% 的覆盖率。我已经知道如何检查是否调用了 done() 回调,以及使用 sinon.js 的 args,问题是我将如何单独测试匿名函数,并使用特定参数调用它以覆盖所有可能的分支。

【问题讨论】:

  • 如果无法从“外部”访问某个功能,诗浓将无法对其进行任何操作。是不是可以将donearg1 传递给单独的方法,而不是使用匿名函数?

标签: javascript node.js unit-testing testing sinon


【解决方案1】:

您可以通过定义done 函数并对其进行监视来测试匿名函数。您需要知道在调用匿名函数时是否使用正确的参数调用此函数。

例如:

// Define the `done` function.
var doneFunction = function (error, args) {
  // do something
};

// Spy on the `done` function to register calls.
var doneSpy = sinon.spy(doneFunction);

// Test the funcBeingTested
funcBeingTested(doneFunction, someArg);

// Check that doneFunction was called
assert(doneSpy.calledWith(someArg));

您可以阅读更多关于Spy API for Sinon

【讨论】:

  • 哦,我没有意识到这可能就是被问到的全部内容:) 我认为目标是监视匿名函数本身,但回读问题可能足以监视它返回。虽然您应该将doneSpy 传递给funcBeingTested,而不是doneFunction
  • @gnerkus 我的意思是我希望能够测试匿名函数以获得 100% 的覆盖率,我知道如何测试回调是否被调用以及使用什么参数,问题是如何单独测试匿名函数?我如何调用它开始,我如何传递任意参数以便我可以覆盖所有可能的分支?
猜你喜欢
  • 2022-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多