考虑以下示例:
void Whole()
{
A().B().C();
}
我已经写了A
, B
, C
的测试方法。它们以许多不同的可能方式使用,例如A().C().B()
或B().A().C()
或B().C().A()
。其中一个用于Whole
方法。有3个!
问题:是否有必要为任何使用的组合编写测试,例如Whole
使用的组合?
Update:基本上,A
和B
和C
是query objects
,并将它们简单地链接为and
-ens它们。但是对于这些方法的其他想法是非常受欢迎的。
考虑h(x)
= f(x)
+ g(x)
。如果我测试f(x), g(x),并测试+操作符工作良好,我是否仍然需要测试h(x)
假设相同的测试上下文存在于所有f
, g
和h
函数?
是。如果有人改变Whole
的实现,会发生什么:
void Whole()
{
A().C().B();
}
如果你没有测试,你就不会知道,并且可能会在你的应用程序中发生不好的事情。
所以你需要测试Whole
。但是你需要什么类型的测试呢?如果whole与A()
、B()
和C()
属于同一个类,并且这些方法以某种可观察的方式修改了该类的状态,那么您可以使用基于状态的测试来验证当Whole
被调用时发生的预期状态变化。由于Whole
是无效的,并且您没有详细说明其他可能的方法,我无法确定这种类型的测试是否合适。
如果A()
B()
和C()
调用其他类来做他们的工作或在其他类中起作用,那么你需要一个基于交互的测试,你会使用mock或测试double来检查当你调用Whole
时预期的交互是否发生,即验证A()
首先被调用,然后B()
,最后C()
。
查看状态测试和基于交互的测试之间的区别
我不怀疑你的函数会一起正确地执行,但是你需要测试它们是否被正确地调用。这可能是一个更好的交互测试,而不是一个状态测试(个别查询的测试-即使状态是在数据库中)。您可能会受益于为Whole
进行测试,只是验证A()
首先被调用,然后是B()
,最后是C()
,或者忽略来自DB的结果,或者为这些测试提供A()
B()
和C()
的模拟实现。
或者完全放弃Whole
方法,让您的客户端调用A().B().C()
自己,然后您将检查它们正在做正确事情的责任转移给它们。但IMHO,如果你提供Whole
方法,你应该测试,它做你所期望的,即使这意味着15个测试(它不是真的那么多)