【问题标题】:How to test a void method returns if condition satisfied如果条件满足,如何测试 void 方法返回
【发布时间】:2012-04-12 01:04:12
【问题描述】:

如何测试这个?

public void TestMethod()
{
   if(aDenpendency.someMethod()) return;

   // Followed by other logic....
}

我在以下逻辑中没有其他依赖项,因此无法使用 AssertWasNotCalled。

提前致谢!!

【问题讨论】:

  • 您应该测试逻辑/行为,并且从您的代码示例中不清楚您要测试什么,请显示完整的方法并提供更多详细信息
  • @sll 我想他是在问他如何断言 return 已在 void 方法中的某个点被调用,而不是在方法结束时才返回。
  • 谢谢罗比,这是我的本意。

标签: c# unit-testing rhino-mocks


【解决方案1】:

按照您的描述进行测试是错误的。并且表示代码结构不佳并且是明确的代码气味,您应该重构和单元测试该代码,鉴于您的目标是测试它尚未被调用,因此您还需要在它被调用时进行测试调用。

你需要一个方法有一个单一的责任,因此为了更明智的单元测试你可以取出返回后的逻辑将它封装在一个方法中,然后对该方法的输出进行单元测试。

单元测试不是用来测试未被调用的东西,它是用来测试模拟/伪造的期望设置,或者您应该测试操作的结果。

您可以编写一个测试,在方法被调用后测试对象的状态,但这实际上是一个集成测试而不是单元测试。这意味着您可以在 return 语句执行后测试应该是的状态,其他代码将不会执行,因此无论修改或处理的内容都不会被修改。

【讨论】:

  • 测试没有问题,例如排序例程调用比较函数正确的次数,如果这是规范的一部分。或者您还建议如何检测O(N^3) 行为?
  • Ben 我是说你不应该测试没有被调用的东西。另外,测试方法之外的任何状态都超出了 A.A.A 单元测试样式(Arrange Act Assert),它更像是一种集成测试,因为您不再测试代码单元更多的结果。那就是如果我正确理解你的观点。
  • 我说我认为测试没有被调用的东西没有任何问题。我无法立即想到 C# 的示例,但是在 C++ 中,您可能想要验证特定函数不会复制其参数,如果它是一个大型数据结构(C++ 中的复制往往是昂贵的深拷贝)。哦,这是一个:在 C# 中,您可能想要测试特定方法是否基于缓存结果运行,并且不会导致新的数据库查询。
  • 对不起 Ben 我不同意,但没关系 :) 你可以在集成中解决这个问题,而不是像描述的​​那样进行单元测试。但我接受这是我的观点,其他人(在这种情况下是你自己)可能不同意
  • 谢谢克里斯坦,我同意。这种代码在我们的解决方案中无处不在,我不相信它是可单元测试的。但是如果在下面的逻辑中有另一个没有被条件包裹的依赖,我们可以使用 assertwasnotcall 来解决。
【解决方案2】:

让您正在测试的方法设置一个“状态”属性怎么样?例如 Running\Processing\Aborted 等?

因此,您可以在设置的任何测试情况下调用您的 void 方法,然后检查属性。回报;和状态属性设置将一起在代码中

if(condition){
    _status = 1; //Or use an enumeration would be better
    return;
}

然后您的测试将通过公共访问器测试状态。

这可能不适用于所有情况,但我正在考虑做这样的事情,我的类有一个 void 方法 Process()。它可能会使您的测试更简单,您不需要模拟(但可能仍然需要存根),并且意味着您可以事后测试是否发生了某些事情而不是未发生的事情(我同意之前的海报,这是尽可能采用更好的方法)

我意识到这可能只是为了进行测试而编写代码的味道,但在我的特殊情况下,我将使用公共属性在代码实际运行期间检查类的状态,因此整个方法与整体设计一致.

【讨论】:

    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多