加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 08:42:48 所属栏目:百科 来源:网络整理
导读:我正在抽象一类我的历史跟踪部分,所以它看起来像这样: private readonly StackMyObject _pastHistory = new StackMyObject();internal virtual Boolean IsAnyHistory { get { return _pastHistory.Any(); } }internal virtual void AddObjectToHistory(MyOb
我正在抽象一类我的历史跟踪部分,所以它看起来像这样:
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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读