gpt4 book ai didi

c# - 使用 Moq,我如何验证一个对象的所有属性都被复制了?

转载 作者:太空狗 更新时间:2023-10-30 01:12:03 24 4
gpt4 key购买 nike

我有一个带有 CopyFrom() 方法的接口(interface),该方法从另一个对象复制所有属性。我有一个执行多个 VerifyGet() 调用的测试,以确保从传递的对象中检索到每个属性,例如:

Thing target = new Thing();
IThing source = new Mock<IThing>();

target.CopyFrom(source.Object);
source.VerifyGet(t => t.Foo);
source.VerifyGet(t => t.Bar);

我想要一种方法来遍历 IThing 的属性,并验证每个属性是否已自动复制,这样如果有人添加属性但忘记复制它,测试将失败。有没有办法通过最小起订量来做到这一点?我试过了;

foreach (var prop in typeof(IThing).GetProperties())
{
source.VerifyGet(t => prop.Invoke(t, null));
}

但它不起作用,因为 lambda 不代表属性访问器。我认为应该有一种方法可以通过 Expression 类创建一些东西,但我对 LINQ 不够熟悉,无法弄清楚那里应该有什么。

最佳答案

我不认为这样的事情对于 Moq 是可能的,但首先你需要质疑你的测试是否相关。您真正想在这里测试什么?

CopyFrom 方法读取任何属性是否重要?它绝对可以读取所有属性,而无需将它们写入新实例,因此这种基于交互的测试并不能真正证明任何事情。

我猜您真正想测试的是目标的属性是否等于源的属性?

假设 IThing 上的属性是可写的,您可以使用 SetupAllProperties 方法创建一个具有所有属性集的 stub :

var sourceStub = new Mock<IThing>();
sourceStub.SetupAllProperties();
sourceStub.Object.Bar = "Bar";
sourceStub.Object.Foo = "Foo";

然后您需要将目标与源进行比较以查看所有属性是否匹配。您可以通过在包装真实目标的类中实现特定于测试的 Equals 方法来做到这一点。

如果您认为这工作量太大,您可能需要查看 AutoFixture的 Likeness 类,为您提供通用的特定于测试的相等性比较。这将允许您像这样继续测试:

var expectedResult = new Likeness<IThing>(sourceStub.Object);

target.CopyFrom(sourceStub.Object);

Assert.AreEqual(expectedResult, target);

相似性使用反射来简单地遍历包装对象中的所有公共(public)属性,并查看比较对象是否具有相同的这些属性值。

关于c# - 使用 Moq,我如何验证一个对象的所有属性都被复制了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1399815/

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