我不确定为函数foo进行单元测试的最佳方法是什么,因为回调被传递到功能栏,我编写的foo的单元测试也在测试函数栏。
有什么办法我只能测试foo里面的逻辑吗?在下面的用例中,我只想确保foo函数可以将值增加1然后将所有内容传递给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();
});
});
答案 0 :(得分: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
,而不是硬编码到该函数。