FluentAssertions基于反射的平等

时间:2012-02-21 07:17:00

标签: .net fluent-assertions

我有一个简单的课程:

public class MyClass()
{
  public string Property1 {get;set;}
  public string Property2 {get;set;}
}

有没有办法在没有Equal方法实现的情况下断言这个类的两个实例是否相等(我想这里的反射很适合)?我不想仅为测试实现Equal。

1 个答案:

答案 0 :(得分:3)

请参阅官方文档中的摘录: http://fluentassertions.codeplex.com/documentation

您可以通过按名称比较其属性来断言整个对象的相等性。如果属性的类型不同但存在内置转换(通过Convert类),这甚至可以工作。例如,考虑来自某个任意域模型的客户实体及其DTO对应的CustomerDto。您可以使用以下语法声明DTO与实体具有相同的值:

dto.ShouldHave().AllProperties().EqualTo(customer);

只要客户端也可以使用dto的所有属性,并且它们的值相等或可转换,断言就会成功。但是,您可以使用属性表达式排除特定属性,例如ID属性:

dto.ShouldHave().AllPropertiesBut(d => d.Id).EqualTo(customer);

相当于:

dto.ShouldHave().AllProperties().But(d => d.Id).EqualTo(customer);

另一种方式也是可能的。因此,如果您只想包含两个特定属性,请使用此语法。

dto.ShouldHave().Properties(d => d.Name, d => d.Address).EqualTo(customer);

最后,如果您只想比较两个对象所具有的属性,可以像这样使用SharedProperties()方法:

  dto.ShouldHave().SharedProperties().EqualTo(customer);

显然,您可以使用But()方法将其链接以排除某些共享属性。

此外,您可以通过包含IncludingNestedObjects属性进一步进行结构比较。这将指示比较比较主题的属性(在此示例中)引用的所有(集合)复杂类型。默认情况下,它将声明主题的嵌套属性与预期对象的嵌套属性匹配。但是,如果确实指定了SharedProperties,那么它只会比较嵌套对象之间同等命名的属性。例如:

dto.ShouldHave().SharedProperties().IncludingNestedObjects.EqualTo(customer);