2017-02-01 7 views
1

mit Microsoft.VisualStudio.TestTools.UnitTesting;C# Vergleichslisten Liste <T>

Ich mag universelle Testverfahren, das Wörterbuch und Funktion erhält, und dann Gleichheit prüft für jeden Wörterbucheintrag zwischen Wert und Funktion (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)); 
    } 
} 

Aber wenn Werte (und Rückgabewert der Funktion) ist

List<int> 

es funktioniert natürlich nicht. Also, ich fand als ich

CollectionAssert.AreEqual 

für solche Fälle. Aber jetzt muss ich sagen, dass mein Wert System.Collections.ICollection ist. Wie macht man das?

+0

Ich weiß. Aber ich bekomme den Fehler "Kann nicht von TValue in System.Collections.ICollection konvertieren". Ich nehme an, ich muss irgendwie sagen, dass TValue kann System.Collections.ICollection – dmitry

Antwort

2

Sie müssen die Werte in ICollection umwandeln, damit der Compiler nicht klagen wird.

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

das funktioniert, danke! außer dass ich System.Collections.ICollection anstelle von ICollection angeben muss – dmitry

+0

Gut zu wissen :) Sie könnten eine 'using System.Collections; '- Anweisung auch zu Ihrer Testklasse hinzufügen. – dana

Verwandte Themen