【问题标题】:How do we (while unit testing) assert if one statement was called before other我们如何(在单元测试时)断言一个语句是否在另一个语句之前被调用
【发布时间】:2015-02-23 17:23:19
【问题描述】:

我们正在使用 RhinoMocks 对我们的 wpf 应用程序进行单元测试。

在其中一个场景中,我们有一个方法 --

public void LetsAdd()
{
    _mockableInterface1.DoSomething();
    _mockableInterface2.DoSomethingElse();
}

现在,当我尝试对 LetsAdd 方法进行单元测试时,我可以断言是否调用了 doSomething() 和 DoSomethingElse()。但是我可以以某种方式测试它们是否按此顺序执行吗?

也就是说,如果我交换两个方法调用,我可以编写一个失败的测试吗?

谢谢

【问题讨论】:

  • 很好奇为什么需要这样做。如果您要求一个方法在另一个方法之前被调用,那不应该在代码而不是测试中强制执行吗?
  • @Pierre-LucPineault...我想我需要提高我的搜索技能...感谢您的发现。如果可行,我会试试这个
  • @RufusL - 在大多数情况下,你所说的都是正确的
  • @RufusL 有多种情况可能会发生这种情况。例如,他可能试图通过他的 DAL 保存两个不同的实体,其中一个必须在另一个之前保存。反转调用只能在数据库级别(由于约束或其他原因)爆炸,这是他正在测试的抽象层之下的一个抽象层。由于它在数据库中,因此代码无法反映这一点(例如,没有返回值)。或者一个简单的.Validate() 然后 .Process(),其中 Validate 不返回值,您希望确保在处理之前调用它。或者在 XNA 中加载资源。

标签: c# .net unit-testing nunit rhino-mocks


【解决方案1】:

如果您有先决条件,则测试必须在测试逻辑之前触发它们。永远不要依赖测试的顺序。如果有特定的数据需要为测试设置,您应该设置它,然后在完成后清理它。这可以通过设置和清理方法在任何测试库中完成。如果您的类足够细粒度,则可以使用类设置和清理方法,否则您必须专注于测试设置和清理方法。

如果设置好,您可以采用测试方法(两种方法都被触发?),但这最终可能会使您的测试无效,因为一个测试以“错误”的顺序运行。但是由于每个测试都应该是自主的,所以不存在“错误”的顺序。

在您的特定场景中,您应该将其设置为按照您需要测试的顺序运行。如果所有场景都有效,则需要进行多次测试。这是我对所有场景的意思(DS = DoSomething 和 DSE = DoSomethingElse):

DS 或 DSE 均不运行 仅限 DS 仅限 DSE 两者,DS优先 两者,DSE优先

如果根据业务规则预期不同的结果,那么您需要全部 5 次测试。而不是测试例程的顺序,您的目标应该是明确测试,强制它们按顺序运行。

如果这在您的测试中无法完成,那么我会看到两个选项:

  1. 重新设计解决方案以消除“随机性”
  2. 为可查询的方法顺序添加某种类型的跟踪

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多