比较两个对象的所有属性的最佳方法是什么,其中一些属性具有不同的格式(例如,DateTime
在一个中,DateTime.ToString()
在其他格式中具有自定义格式?
我能够通过使用2个断言来做到这一点:
o1.ShouldHave().AllPropertiesBut(dto1 => dto1.Date).EqualTo(o2);
o1.Date.Should().Be(DateTime.Parse(o2.Date));
我会考虑以下内容,但由于EqualTo<T>()
无效,因此无法编译。
o1.ShouldHave().AllProperties().But(d => d.Date).EqualTo(o2)
.And.Date.Should().Be((DateTime.Parse(o2.Date));
类型是:
public class Dto1
{
public int ID { get { return 1; } }
public DateTime Date { get { return DateTime.Now.Date; } }
}
public class Dto2
{
public int ID { get { return 1; } }
public string Date { get { return DateTime.Now.Date.ToShortDateString(); } }
}
var o1 = new Dto1();
var o2 = new Dto2();
答案 0 :(得分:2)
第一个例子通常是最好的方法。但是,如果要切换o1和o2,它可能只能在一次调用中工作。 Fluent Assertions将尝试将(使用Convert.ChangeType)属性的实际值转换为具有相同名称的属性的预期值。在您的特定示例中,它会尝试在比较值之前将Dto1中的DateTime转换为Dto2中的字符串。但由于DateTime的字符串表示依赖于线程的文化,因此它不会给您可预测的结果。但是,如果要切换o1和o2,如果Convert.ChangeType成功将短日期时间转换回DateTIme对象,我不会感到惊讶。
作为旁注,我的DTO通常只是将DateTime传递给调用者而不进行任何字符串转换。我相信DateTime的实际表示纯粹是UI的责任。
HTH
丹尼斯