我如何模拟私人领域?

Fun*_*ung 16 c# unit-testing mocking

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

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

我要做的是创建一个单元测试,断言ISnapshot.FreezeFrom(IUpdates)从内部调用Cache.Freeze(IUpdates).我猜我应该用_latest_snapshot模拟对象替换私有字段(可能是错误的假设?).我如何在保留无参数构造函数的同时不依赖于LatestSnapshot公开?

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

ISnapshot.FreezeFrom它本身的实际实现使用深度对象图调用其他方法的层次结构,所以我不太热衷于断言对象图.

提前致谢.

Ale*_*x B 22

我几乎引用了"有效使用遗留代码"的技巧:

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