如何比较具有相同名称但不同类型属性的对象?
public class A
{
public Guid Id { get; set; }
}
public class B
{
public string Id { get; set; }
}
public static B Map(A a){
return new B { Id = a.Id.ToString() };
}
版本 1:
void Main()
{
A a = new A { Id = Guid.NewGuid() };
B b = Map(a);
b.Should().BeEquivalentTo(a);
}
这会产生以下错误:
AssertionFailedException: 期望成员 Id 为 {ff73e7c7-21f0-4f45-85fa-f26cd1ecafd0},但实际上找到了 "{ff73e7c7-21f0-4f45-85fa-f26cd1ecafd0}"。
文档建议使用 等价比较行为 可能可以实现自定义属性断言规则。
版本2:
void Main()
{
A a = new A { Id = Guid.NewGuid() };
B b = Map(a);
b.Should().BeEquivalentTo(a,
options => options
.Using<Guid>(ctx => ctx.Subject.Should().Be(ctx.Expectation))
.WhenTypeIs<Guid>());
}
但是如果属性不是相同的类型,它会产生运行时异常。
AssertionFailedException: 期望主题的成员 Id 是 System.Guid 类型,但发现是 System.String 类型。
有什么想法吗?
.Using<string, Guid>(ctx => ctx.Subject.Should().Be(ctx.Expectation.ToString())).When(info => info.SelectedMemberPath.EndsWith("Id")))
。这应该会更加稳定和表达力强。 - Jonas Nyrup