2014-08-28 69 views
0

我不知道什么是做函数foo单元测试的最佳方法,因为回调传递给功能栏,我写的foo的单元测试也测试功能栏。单元测试函数与回调传递给另一个函数

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

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(); 
    }); 
}); 

回答

1

此代码是下面的代码同步或多或少类似:

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

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

现在,我们正在寻找的东西多一点熟悉,我们可以再次问你的问题。答案显然不是 - foo始终调用bar

如果您可以同时测试foobar,这应该没有关系 - 根据哪些失败,您可以找出错误的位置。

如果bar就像是db调用,你可能无法测试,你应该研究一下“模拟”函数/对象的想法。如果bar不是应该被嘲笑的,但foo应该在不使用bar的情况下进行测试,那么这表示bar应该作为参数传递给foo,而不是硬编码到该函数中。

+0

示例代码可以重写为您编写的代码,但正如您猜测的,在我的实际使用情况中,它就像是需要嘲笑的db调用。你能否提供一下你如何在我的案例中嘲笑酒吧? – siyang 2014-08-28 03:25:01

+0

@siyang我建议寻找图书馆嘲笑(搜索npm应该是有启发性的)。我从来没有用javascript做过,所以我没有什么实用的东西可以为过去的关键词“模拟”做出贡献。 – 2014-08-28 14:03:57

+0

我用sinon来存根功能,只是想知道别人怎么做。感谢您的帮助! – siyang 2014-08-28 23:32:04

相关问题