2017-02-01 26 views
1

с использованием Microsoft.VisualStudio.TestTools.UnitTesting;C# сравнения списков Список <T>

Я хочу универсальный тестовый метод, который получает словарь и функцию, а затем проверить равенство для каждой словарной записи между Value и функциями (Key):

public void TestMethod<TKey, TValue>(Dictionary<TKey, TValue> dict, Func<TKey, TValue> func) 
{ 
    foreach (var test in dict) 
    { 
     Assert.AreEqual(test.Value, func(test.Key)); 
    } 
} 

Но если значение (и возвращаемое значение функции)

List<int> 

Это не работает, конечно. Итак, я нашел, чем мне нужно

CollectionAssert.AreEqual 

для таких случаев. Но теперь я должен сказать, что мое значение - System.Collections.ICollection. Как это сделать?

+0

Я знаю. Но я получаю сообщение об ошибке «Невозможно преобразовать из TValue в System.Collections.ICollection». Полагаю, я должен как-то сказать, что TValue может быть System.Collections.ICollection – dmitry

ответ

2

Вам необходимо указать значения ICollection, чтобы компилятор не пожаловался.

public void TestMethod<TKey, TValue>(Dictionary<TKey, TValue> dict, Func<TKey, TValue> func) 
{ 
    foreach (var test in dict) 
    { 
     if (test.Value is ICollection) 
     { 
       CollectionAssert.AreEqual((ICollection)test.Value, (ICollection)func(test.Key)); 
     } 
     else 
     { 
       Assert.AreEqual(test.Value, func(test.Key)); 
     } 
    } 
} 
+1

это работает, спасибо! за исключением того, что мне нужно указать System.Collections.ICollection вместо ICollection – dmitry

+0

Полезно знать :) Вы также можете добавить оператор 'using System.Collections;' в свой тестовый класс. – dana