在为功能编写单元测试时,我应该模拟进行的内部功能调用吗?

时间:2018-06-21 06:56:47

标签: c++ unit-testing

struct api {
   void do_yo() {
      a = func1();
      if (a) dosomething();
      func2();
      dosomething2();
   }
};

现在我正在为do_yo编写单元测试,所以我应该模拟func1func2吗?

还是只是测试do_yo的可观察效果?

3 个答案:

答案 0 :(得分:2)

是的,您需要模拟func1()func2()来了解do_yo()对来自它们的不同随机行为的反应。

由于func1()do_yo()的影响最大,因此您需要定义a可能使do_yo()失败或成功的值。

最终,单元测试的目的是消除基于一组未知输入的不确定或零星的行为。 (即代码覆盖率更高)。


更新

如果一个函数依赖于外部因素,那么模拟所有可能的行为将具有挑战性,并且肯定会花费时间。因此,我们有句俗话:“只要您能控制什么,什么有意义,就嘲笑它们”。

答案 1 :(得分:1)

这实际上更多是一个概念性问题。

简单的答案是:模拟应该被视为万不得已。仅在必要时使用它。含义:没有其他方法可以在不使用模拟的情况下充分测试被测代码。

因此:时,您无需使用模拟就可以为do_yo()编写良好的单元测试,然后进行操作。但是,如果您确实需要控制此类内部方法调用,则可能无法绕开它们的模拟。

这实际上是关于平衡不同的要求/实践。

答案 2 :(得分:1)

很难说清,因为func1func2上没有足够的信息,但是如果它们如您所说是公开的,那么我会嘲笑它们。

如果它们是公开的,那么您也应该对其进行单元测试,而不考虑测试do_yo,因此您可以证明它们的逻辑符合您的预期。

(将其作为餐厅的试运行:如果您测试了厨师是否可以准备饭菜以满足您的期望,现在您想测试一下从厨房取餐的服务员,那么您需要做的就是厨房工作人员对“饭准备好”的回应,或者您可能期望的其他回应,而不是真实的用餐。)

并且正如某些人所提到的,如果func1func2遇到了一些外部因素,那么这将成为一种集成测试,因为它不会嘲笑它们。