当前位置: 首页 > 编程语言 > C#

如何模拟私有字段?分享

时间:2023-04-11 10:51:43 C#

如何模拟私有字段?我真的在开玩笑,我正在尝试用模拟对象替换私有字段。目前,私有字段的实例是在构造函数中创建的。我的代码看起来像...publicclassCache{privateISnapshot_latest_snapshot;publicISnapshotLatestSnapshot{get{返回这个._latest_snapshot;}私有集{this._latest_snapshot=value;}}publicCache(){this.LatestSnapshot=newSnapshot();}publicvoidFreeze(IUpdatesUpdates){ISnapshot_next=this.LastestSnapshot.CreateNext();_next.FreezeFrom(更新);this.LastestSnapshot=_next;我想要做的是创建一个断言ISnapshot.FreezeFrom(IUpdates的单元测试)是从ISnapshot.FreezeFrom(IUpdates)调用的。我想我应该用模拟对象替换私有字段_latest_snapshot(可能是错误的假设?)。如何在保留无参数构造函数的同时不使用LatestSnapshot设置进行公开?如果我打算以错误的方式编写测试,请指出。ISnapshot.FreezeFrom的实际实现本身使用深层对象图层次结构来调用其他方法,因此我不太热衷于断言对象图。提前致谢。我几乎引用了“有效使用遗留代码”的提示:在单元测试中对您的类进行子类化,并用其中的模拟对象替换您的私有变量(通过添加公共设置器或在构造函数中)。您可能必须使变量受保护。为此私有变量创建一个受保护的getter并在您的测试子类中覆盖它以返回一个模拟对象而不是实际的私有变量。创建一个用于创建ISnapshot对象的受保护工厂方法,并在您的测试子类中覆盖它以返回模拟对象的实例而不是实际对象。这样构造函数将从一开始就获得正确的值。参数化构造函数以获取ISnapshot的实例。我认为您不需要模拟私有成员变量。模拟对象的公共接口是否按预期工作的整个想法不是吗?私有变量是模拟不关心的实现细节。我不确定你能做到这一点。如果你想测试_next那么你可能必须将它作为参数传递,然后在单元测试中传递Mock对象,然后你可以用Expectation测试它。如果我尝试在最小起订量中这样做,那就是我会做的。作为我可能会尝试使用Moq框架的示例:MocksnapshotMock=newMock();snapshotMock.Expect(p=>p.FreezeFrom(expectedUpdate)).AtMostOnce();缓存c=newCache(snapshotMock.Object);C。冻结(预期更新);注意:我没有尝试编译上面的代码。这只是展示我如何解决这个问题的一个例子。这个答案可能很简单,但是看代码,有没有办法调用ISnapshot.FreezeFrom(IUpdates)?听起来您想断言它一直都是真的。正如Jason所说,模拟适用于当您的类依赖于SomeInterface来完成其工作时,并且您想独立于您在运行时实际使用的SomeInterface的任何实现来测试YourClass。要问的问题是:如果有效,外部可见的效果是什么?所有这些快照会发生什么?一个选择可能是用外部的第一个快照初始化缓存,比如在构造函数中。另一种可能性是为缓存之外的任何重要内容模拟快照调用。这取决于你关心什么。可能为时已晚。反正。我也有类似的问题。公共类模型{publicISomeClassXYZ{get;私有集;我需要在我的测试用例中设置XYZ的值。我使用这个语法解决了这个问题。Expect.Call(_model.XYZ).Return(newSomeClass());_repository.ReplayAll();在上面的例子中,我们可以做Expect.Call(_cache.LatestSnapshot).Return(newSnapshot());_repository.ReplayAll();您可能必须像这样重构您的类,以便为ISnapshot注入不同的依赖项。您的班级将保持相同的功能。公共类缓存{私有ISnapshot_latest_snapshot;publicISnapshotLatestSnapshot{get{返回这个._latest_snapshot;}私有集{this._latest_snapshot=value;}}publicCache():this(newSnapshot()){}publicCache(ISnapshotlatestSnapshot){this.LatestSnapshot=latestSnapshot;}publicvoidFreeze(IUpdatesUpdates){ISnapshot_next=this.LastestSnapshot.CreateNext();_next.FreezeFrom(更新);this.LatestSnapshot=_next;您可以使用模拟类实例将“setSnapshot(ISnapshot)”方法添加到缓存。您还可以使用ISnapshot添加构造函数。将缓存转换为模板,如下所示。templatepublicclassCache{privateT_latest_snapshot;publicTLatestSnapshot{get{returnthis._latest_snapshot;}私有集{this._latest_snapshot=value;}}publicCache(){this.LatestSnapshot=newSnapshot();}publicvoidFreeze(IUpdatesUpdates){T_next=this.LastestSnapshot.CreateNext();_next.FreezeFrom(更新);this.LastestSnapshot=_next;在生产代码中执行:Cachefoo;//或Cachebar;在测试代??码中在代码中做:以上是C#学习教程:如何模拟私有字段?分享的所有内容,如果对你有用,需要进一步了解C#学习教程,希望大家多多关注——CachemockFoo;如需转载请注明出处:

最新推荐
猜你喜欢