【问题标题】:unit test the function with callback passed to another function单元测试函数,回调传递给另一个函数
【发布时间】:2014-10-21 18:31:31
【问题描述】:

我不确定对函数 foo 进行单元测试的最佳方法是什么,因为回调传递给函数 bar,所以我为 foo 编写的单元测试也在测试函数 bar。

有什么办法只能测试 foo 内部的逻辑吗?在下面的用例中,我只想确保 foo 函数可以将值增加 1,然后将所有内容传递给 bar。 bar 如何处理值应该在 bar 单元测试而不是 foo 单元测试中进行测试。

function bar(value, callback) {
    value = value + 1;
    callback(value);
}

function foo(value, callback) {
    value = value + 1;
    bar(value, callback);
}


//test for function bar
it('should be able to increase value by 1', function (done) {
    bar(1, function (value) {
    expect(value).to.equal(2);
    done();
  });
});

//test for function foo
it('should be able to increase value by 2', function (done) {
    foo(1, function (value) {
    expect(value).to.equal(3);
    done();
   });
});

【问题讨论】:

    标签: node.js


    【解决方案1】:

    这段代码或多或少类似于下面的同步代码:

    function bar(value) {
        value = value + 1;
        return value;
    }
    
    function foo(value) {
        value = value + 1;
        return bar(value);
    }
    

    现在我们正在研究一些更熟悉的东西,我们可以再次询问您的问题。显然,答案是否定的——foo 总是调用bar。

    如果您可以同时测试 foo 和 bar,那应该没关系 - 根据其中哪个失败,您可以找出错误所在。

    如果bar 类似于数据库调用,您可能无法对其进行测试,那么您应该研究“模拟”函数/对象的想法。如果bar 不应该被嘲笑,但foo 应该在不使用bar 的情况下进行测试,那么这表明bar 应该作为参数传递给foo,而不是硬编码到那个函数。

    【讨论】:

    • 示例代码可以重写为您编写的代码,但是正如您猜测的那样,在我的实际用例中,它就像一个需要模拟的数据库调用。你能提供在我上面的例子中你是如何模拟酒吧的吗?
    • @siyang 我建议查看一个用于模拟的库(搜索 npm 应该是有益的)。我从来没有用 javascript 做过,所以在给你关键字“mock”之后,我真的没有什么有用的贡献。
    • 我使用 sinon 来存根函数,只是想知道其他人是如何做到的。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    相关资源
    最近更新 更多