Это своего рода «расширенный комментарий» в связи с ответом Марка, пытаясь опираться на его решение Law Postel's Law. Параметр, меняющийся в конструкторе, чувствовал себя неловко для меня, поэтому я сделал переопределение даты в явном виде в классе Period.
С помощью синтаксиса C # 6 для краткости:
public class Period
{
public DateTime Start { get; }
public DateTime End { get; }
public Period(DateTime start, DateTime end)
{
if (start > end) throw new ArgumentException("start should be before end");
Start = start;
End = end;
}
public static Period CreateSpanningDates(DateTime x, DateTime y, params DateTime[] others)
{
var all = others.Concat(new[] { x, y });
var start = all.Min();
var end = all.Max();
return new Duration(start, end);
}
}
public class SomeClass
{
public DateTime ValidFrom { get; }
public DateTime ExpirationDate { get; }
public SomeClass(Period period)
{
ValidFrom = period.Start;
ExpirationDate = period.End;
}
}
Затем вам нужно будет настроить ваш прибор для Period
для использования статического конструктора:
fixture.Customize(f =>
f.FromFactory((x, y) => Period.CreateSpanningDates(x, y)));
Я думаю, что основное преимущество этого решения заключается в том, что он извлекает время (SRP) и оставляет вашу бизнес-логику выраженной в терминах уже согласованного контракта, очевидного из подписи конструктора.
Похоже, что это либо проблемы с путем отчета, попробуйте предложение здесь: код проекта
Или, если это не проблема, есть ли более чем одна версия CR установлена в машине ? потому что это вызывает проблемы, подобные этой. Попробуйте удалить и установить правильную версию снова.