- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如何比较具有名称相同但类型不同的属性的对象?
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/1087627 的 DifferentObjectsEquivalencyStep
和您自己的 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/
如何比较具有名称相同但类型不同的属性的对象? public class A { public Guid Id { get; set; } } public class B { publ
我正在集成测试中创建两个相同类型的对象,但试图排除在创建对象时生成的自动递增成员。 我成功排除了 RecordId 和 Number 属性,但对 Id 属性的等效性测试失败。 RecordId 和 n
我有一个测试来验证方法的集合输出。此测试变体通过了: [TestMethod, TestCategory("BVT")] public void TheStatusesAreRetur
尝试比较具有单个私有(private)字段的对象 像这样的对象: public struct A { private readonly byte[] bytes; public A(b
我在单元测试中使用流畅的断言,但是使用 ShouldBeEquivalentTo , ShouldAllBeEquivalentTo , 和 BeEquivalentTo不清楚。 例如;以下所有语句都
谁能总结一下它们之间的区别和使用范围? 我阅读了 SO 文章, ShouldBeEquivalientTo() :ShouldBeEquivalentTo() 旨在用于比较复杂的对象图,而不是 .NE
我有以下测试说明了我试图实现的一个简单示例(两个等效列表的比较): [Fact] public void Test() { // Arrange var list1 = new Lis
我有一个名为 HandRank 的类,它有一个 Id 属性。 Id 属性由我的数据库生成。 public class HandRank { [Key] [DatabaseGenerat
我有一个名为 HandRank 的类,它有一个 Id 属性。 Id 属性由我的数据库生成。 public class HandRank { [Key] [DatabaseGenerat
我有一个简单的类,它有两个属性并覆盖了 Equals 方法: public class Person : IEquatable { public Guid Id { get; set; }
我是一名优秀的程序员,十分优秀!