c# – 单元测试跟踪状态的类

前端之家收集整理的这篇文章主要介绍了c# – 单元测试跟踪状态的类前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在抽象一类我的历史跟踪部分,所以它看起来像这样:
private readonly Stack<MyObject> _pastHistory = new Stack<MyObject>();

internal virtual Boolean IsAnyHistory { get { return _pastHistory.Any(); } }

internal virtual void AddObjectToHistory(MyObject myObject)
{
  if (myObject == null) throw new ArgumentNullException("myObject");
  _pastHistory.Push(myObject);
}

internal virtual MyObject RemoveLastObject()
{
  if(!IsAnyHistory) throw new InvalidOperationException("There is no prevIoUs history.");
  return _pastHistory.Pop();
}

我的问题是我想单元测试Remove会返回最后添加的对象.

> AddObjectToHistory
> RemoveObjectToHistory – >返回通过AddObjectToHistory放入的内容

但是,如果我必须先调用Add,它不是真正的单元测试吗?但是,我能看到以真正的单元测试方式执行此操作的唯一方法是在构造函数中传入Stack对象或模拟出IsAnyHistory ……但是模拟我的SUT也很奇怪.所以,我的问题是,从教条的角度来看,这是一个单元测试吗?如果没有,我该如何清理它…是构造函数注入我唯一的方法?它似乎只是需要传递一个简单的对象?是否可以将这个简单的物体推出注入?

解决方法

这些方案有两种方法

>干扰设计,比如使_pastHistory内部/保护或注入堆栈
>使用其他(可能是单元测试的)方法来执行验证

与往常一样,没有黄金法则,虽然我会说你通常应该避免单元测试强制设计变更的情况(因为这些变化很可能会给代码消费者带来歧义/不必要的问题).

尽管如此,最终你需要权衡单元测试代码对设计的干扰程度(第一种情况)或弯曲完美的单元测试定义(第二种情况).

通常情况下,我发现第二种情况更具吸引力 – 它不会使原始类代码混乱,并且您很可能已经添加已经测试过的 – it’s safe to rely on it.

猜你在找的C#相关文章