gpt4 book ai didi

c# - FluentAssertions - Should().BeEquivalentTo() 当属性属于不同类型时

转载 作者:太空宇宙 更新时间:2023-11-03 20:57:24 27 4
gpt4 key购买 nike

如何比较具有名称相同但类型不同的属性的对象?

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: Expected member Id to be {ff73e7c7-21f0-4f45-85fa-f26cd1ecafd0}, but found "{ff73e7c7-21f0-4f45-85fa-f26cd1ecafd0}".

文档表明可以使用 Equivalence Comparison Behavior 自定义属性断言规则。

版本 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: Expected member Id from subject to be a System.Guid, but found a System.String.

有什么想法吗?

最佳答案

这里有两种方法可以比较具有不同类型的同名成员的对象。

第一种方法是指定名为Id的成员之间的等价性

A expected = new A { Id = Guid.NewGuid() };
B actual = Map(expected);

actual.Should().BeEquivalentTo(expected,
options => options
.Using<object>(ctx => ctx.Subject.Should().Be(ctx.Expectation.ToString()))
.When(info => info.SelectedMemberPath.EndsWith("Id")));

第二种方法使用来自 https://stackoverflow.com/a/47947052/1087627DifferentObjectsEquivalencyStep和您自己的 Map 函数。然后它将 A 的实例转换为 B,现在很容易比较它们。

AssertionOptions.AssertEquivalencyUsing(c => 
c.Using(new DifferentObjectsEquivalencyStep<A, B>(Map)));

A expected = new A { Id = Guid.NewGuid() };
B actual = Map(expected);

actual.Should().BeEquivalentTo(expected);

有一个开放的issue关于它。

关于c# - FluentAssertions - Should().BeEquivalentTo() 当属性属于不同类型时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49054041/

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