struct api {
void do_yo() {
a = func1();
if (a) dosomething();
func2();
dosomething2();
}
};
现在我正在为do_yo
编写单元测试,所以我应该模拟func1
和func2
吗?
还是只是测试do_yo
的可观察效果?
答案 0 :(得分:2)
是的,您需要模拟func1()
和func2()
来了解do_yo()
对来自它们的不同随机行为的反应。
由于func1()
对do_yo()
的影响最大,因此您需要定义a
可能使do_yo()
失败或成功的值。
最终,单元测试的目的是消除基于一组未知输入的不确定或零星的行为。 (即代码覆盖率更高)。
如果一个函数依赖于外部因素,那么模拟所有可能的行为将具有挑战性,并且肯定会花费时间。因此,我们有句俗话:“只要您能控制什么,什么有意义,就嘲笑它们”。
答案 1 :(得分:1)
这实际上更多是一个概念性问题。
简单的答案是:模拟应该被视为万不得已。仅在必要时使用它。含义:没有其他方法可以在不使用模拟的情况下充分测试被测代码。
因此:当时,您无需使用模拟就可以为do_yo()
编写良好的单元测试,然后进行操作。但是,如果您确实需要控制此类内部方法调用,则可能无法绕开它们的模拟。
这实际上是关于平衡不同的要求/实践。
答案 2 :(得分:1)
很难说清,因为func1
和func2
上没有足够的信息,但是如果它们如您所说是公开的,那么我会嘲笑它们。
如果它们是公开的,那么您也应该对其进行单元测试,而不考虑测试do_yo
,因此您可以证明它们的逻辑符合您的预期。
(将其作为餐厅的试运行:如果您测试了厨师是否可以准备饭菜以满足您的期望,现在您想测试一下从厨房取餐的服务员,那么您需要做的就是厨房工作人员对“饭准备好”的回应,或者您可能期望的其他回应,而不是真实的用餐。)
并且正如某些人所提到的,如果func1
和func2
遇到了一些外部因素,那么这将成为一种集成测试,因为它不会嘲笑它们。