【问题标题】:Unit Testing: Using another method to check the method under test ran correctly单元测试:使用另一种方法检查被测方法是否正确运行
【发布时间】:2010-12-22 16:44:30
【问题描述】:

我正在正确地编写单元测试,我想知道通过调用另一个方法来验证结果来测试被测方法的结果是一种不好的技术吗?

即。在下面的示例中,我只能通过调用 FetchObject 或 HasCachedObjects 属性来检查 StoreObject 方法调用是否成功(即存储在缓存中的对象),这两者都包含应单独测试的逻辑。在这种结果对公共 API 隐藏的情况下,您会怎么做?

我有一个缓存类:

public class Cache {

  private Dictionary<string, object> _Cache = null;

  public bool HasCachedObjects {
    get {
      if (_Cache.Count > 0) {
        return true;
      } else {
        return false;
      }
    }
  }

  public Cache() {
    _Cache = new Dictionary<string,object>();
  }

  public void StoreObject(string key, object obj) {
    _Cache[key] = obj;
  }

  public object FetchObject(string key) {
    if (_Cache.ContainsKey(key)) {
      return _Cache[key];
    }

    return null;
  }
}

【问题讨论】:

  • 它是一个虚构的简单类,将调用 cache.StoreObject("test", obj);然后 Assert.AreEqual(true, cache.HasCachedObjects);或类似的东西

标签: c# unit-testing


【解决方案1】:

一点也不。事实上,这可能是两种不同的测试——一种是在缓存对象后验证 HasCachedObjects 是否为真,另一种是在存储对象后验证您是否可以检索它。

(我不太确定这个类的作用,只是将字典包装在一个稍微不同的 API 中,但这是另一个话题......)

【讨论】:

  • 这是一个非常简化的问题示例类......那是一个“主题”吗?
  • 因为这个类似乎没有太大的价值,所以很难真正弄清楚如何测试它。一般来说,我避免基于状态的测试,但这确实是您对所呈现的设计唯一可以做的事情。我通常使用 TDD 和单元测试来指定类行为的要求,然后编写代码来匹配它......在这种情况下,不清楚该类实际上在做什么,或者应该做什么,那么如何测试它同样不清楚。
  • 但是补充一下 TrueWill 所说的话,我同意 - 不要将测试视为测试特定方法,将其视为测试类的特定行为。一个方法可以被多个测试调用,一个测试也可以调用多个方法……
  • 我认为它很明显,存储或获取对象。这样想......你将如何测试字典?为什么要避免基于状态的测试?
  • 对于值对象和容器,基于状态的测试显然是要做的事情,但是对于更多地属于“对象”而不是“值”的事情,交互测试通常更优越。您不想做的是通过副作用进行测试,因为这通常不是真正的单元测试,而是测试整个对象链。
【解决方案2】:

不要将测试用例视为测试方法;将其视为测试一个功能单元(或者可能是一个用例)。

所以你的测试可能是 StoreObject_WhenSuccessful_AddsToCache 之类的。

是的,我会通过公共 API 确认测试。

【讨论】:

    【解决方案3】:

    您可以测试不同的用例/场景,而不是测试单个方法,例如:添加到缓存 - 检查对象是否存在等...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      相关资源
      最近更新 更多