gpt4 book ai didi

c# - 我如何模拟私有(private)领域?

转载 作者:可可西里 更新时间:2023-11-01 03:06:32 27 4
gpt4 key购买 nike

我真的是模拟的新手,正在尝试用模拟对象替换私有(private)字段。目前私有(private)字段的实例是在构造函数中创建的。我的代码看起来像...

public class Cache {
private ISnapshot _lastest_snapshot;

public ISnapshot LatestSnapshot {
get { return this._lastest_snapshot; }
private set { this._latest_snapshot = value; }
}

public Cache() {
this.LatestSnapshot = new Snapshot();
}

public void Freeze(IUpdates Updates) {
ISnapshot _next = this.LastestSnapshot.CreateNext();
_next.FreezeFrom(Updates);
this.LastestSnapshot = _next;
}

}

我想做的是创建一个单元测试,断言 ISnapshot.FreezeFrom(IUpdates) 是从 Cache.Freeze(IUpdates) 中调用的。我猜我应该用模拟对象替换私有(private)字段 _latest_snapshot(也许是错误的假设?)。在保留无参数构造函数而不求助于将 LatestSnapshot 设置为公开的情况下,我将如何处理?

如果我完全打算以错误的方式编写测试,那么也请指出。

ISnapshot.FreezeFrom 的实际实现本身调用了具有深层对象图的其他方法的层次结构,因此我不太热衷于断言对象图。

提前致谢。

最佳答案

我几乎是在引用 "Working Effectively with Legacy Code" 中的技术:

  1. 在单元测试中对您的类进行子类化,并用其中的模拟对象取代您的私有(private)变量(通过添加公共(public) setter 或在构造函数中)。您可能必须使变量受到保护。
  2. 为这个私有(private)变量创建一个 protected getter,并在测试子类中覆盖它以返回一个模拟对象而不是实际的私有(private)变量。
  3. 创建一个用于创建ISnapshot 对象的 protected 工厂方法,并在测试子类中覆盖它以返回模拟对象的实例而不是真实对象。这样,构造函数将从一开始就获得正确的值。
  4. 参数化构造函数以获取 ISnapshot 的实例。

关于c# - 我如何模拟私有(private)领域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/584769/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com