2012-01-31 46 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