Сравните объекты, где некоторые реквизиты имеют разные форматы - PullRequest
4 голосов
/ 31 января 2012

Каков наилучший способ сравнить все свойства двух объектов, где некоторые из них имеют разные форматы (например, 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();

1 Ответ

2 голосов
/ 31 января 2012

Первый пример, как правило, лучший. Однако если вы переключите o1 и o2, это может сработать за один вызов. Fluent Assertions попытается преобразовать (используя Convert.ChangeType) фактическое значение свойства в ожидаемое значение свойства с тем же именем. В вашем конкретном примере он попытается преобразовать DateTime в Dto1 в строку в Dto2 перед сравнением значений. Но поскольку строковое представление DateTime зависит от культуры потока, оно не даст предсказуемых результатов. Однако, если вы переключите o1 и o2, я не удивлюсь, если Convert.ChangeType успешно преобразует ваше короткое datetime обратно в объект DateTIme.

Как примечание, мои DTO обычно просто передают DateTime вызывающей стороне без преобразования строки. Я считаю, что фактическое представление DateTime является исключительно обязанностью пользовательского интерфейса.

НТН

Денис

...