2012-01-31 16 views
4

什么是比较两个对象的所有属性,其中一些人有不同的格式(例如,在一个DateTimeDateTime.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(); 

回答

2

第一个例子是典型的最佳方式。但是,如果您要切换o1和o2,它可能会在一个通话中工作。流利的断言会试图将属性的实际值转换(使用Convert.ChangeType)具有相同名称的属性的预期值。在您的具体的例子,它会尝试将时间值转换中Dto1为字符串在Dto2比较值之前。但是,由于日期时间的字符串表示取决于线程的文化,它不会给你预测的结果。但是,如果将切换01和02,我不会感到惊讶,如果Convert.ChangeType将成功地将您的短日期时间回DateTime对象。

作为一个侧面说明,我的DTO的通常只是通过日期时间给调用者没有任何的字符串转换。我相信DateTime的实际表示纯粹是UI的责任。

HTH

丹尼斯

+0

谢谢回答。据我所知,DateTime转换依赖于文化 - 这仅仅是一个例子。只是想知道为什么'EqualTo ()'不允许方法链接:) 顺便说一句流利的插入是真棒 - thx为您的工作。 – 2012-01-31 21:44:47