Ответ 1
В Fluent Assertion 2.0 мне наконец удалось решить вышеуказанные проблемы достойным образом. Читайте все об этом здесь: http://www.dennisdoomen.net/2012/09/asserting-object-graph-equivalence.html
У меня есть два метода расширения:
public static IPropertyAssertions<T> ShouldHave<T>(this T subject)
{
return new PropertyAssertions<T>(subject);
}
public static IPropertyAssertions<T> ShouldHave<T>(this IEnumerable<T> subject)
{
return new CollectionPropertyAssertions<T>(subject);
}
Теперь я пишу код, который его использует:
List<Customer> collection2 = new List<Customer>();
collection2.ShouldHave(); //first overload is chosen
IEnumerable<Customer> collection3 = new List<Customer>();
collection3.ShouldHave(); //second overload is chosen
Вторая перегрузка выбирается, только если я явно укажу тип IEnumerable. Есть ли способ сделать вторую перегрузку в обоих случаях?
В Fluent Assertion 2.0 мне наконец удалось решить вышеуказанные проблемы достойным образом. Читайте все об этом здесь: http://www.dennisdoomen.net/2012/09/asserting-object-graph-equivalence.html
Первая перегрузка - лучшее совпадение, поскольку T выводится как List<Customer>
, что дает точное соответствие. Для второй перегрузки он выводит T как Customer
, поэтому параметр будет IEnumerable<Customer>
, что менее точное, чем List<Customer>
.
Не думай так. Не думайте, что возможно, что в этом случае IEnumerable<T>
всегда будет вызываться перегрузка, поскольку она имеет менее точное совпадение в отношении типа T
. Если вы не укажете конкретный IEnumerable<T>
, наилучшее совпадение всегда будет первым методом, в данном случае.
ShouldHave() имеет двойное значение. В первом случае ShouldHave() имеет возврат об объекте, предоставленном объектом-параметром. Во втором случае возврат относится к элементам в перечислении, а не к самому перечислению.
В случае, если я создаю свою собственную коллекцию, и я хочу протестировать эту коллекцию (а не элементы), я, конечно, хочу, чтобы был вызван ShouldHave (этот T-объект), а не ShouldHave (этот объект IEnumerable).
Возможно, вам стоит пересмотреть свой дизайн. Вторая функция ShouldHave() выполняет две функции, поэтому ее следует разделить на метод, который извлекает элементы коллекции и вызов первого ShouldHave(), который у вас уже есть.