Frage

Ich möchte Einheit testen Sie die folgende Methode

public IEnumerable<T> GetData<T>(StreamReader fileStream) where T : new()

Die Stream muss eine Datei im CSV-Format sein, mit bestimmten Spaltennamen.

Ist es möglich, solche Dateien in Code zu erstellen, anstatt viele von ihnen auf dem Dateisystem für jeden Unit-Test müssen?

Irgendwelche Ideen?

UPDATE:

realisiert nur die Bibliothek, die ich Linq2Csv verwende, hat Methoden zu tun genau dies

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

War es hilfreich?

Lösung

Sure:

var buffer = Encoding.Default.GetBytes("ab;cd;ef");
using (var stream = new MemoryStream(buffer))
using (var reader = new StreamReader(stream))
{
    var actual = GetData<SomeClass>(reader);
    // TODO: assert on actual
}

Andere Tipps

In Ihrem Test, können Sie das Verfahren einen StreamReader übergeben, die von einem MemoryStream liest statt aus einer Datei oder FileStream. Die MemoryStream wiederum mit Inhalt gefüllt werden, die den Inhalt der Datei während der Testanordnung ähnelt.

Im Idealfall, um die Signatur ändern:

public IEnumerable<T> GetData<T>(TextReader fileStream) where T : new()

Dann können Sie in einem StringReader passieren wirklich leicht.

Alternativen:

  • Beispieldateien haben in der Testanordnung eingebettet ist, holen Ströme mit Assembly.GetManifestResourceStream() und erstellen Sie eine StreamReader aus, dass
  • Verwenden Sie Encoding.GetBytes(text) und wickeln Sie das Ergebnis in einem MemoryStream, dann bauen eine Stream über das

Für kurze Tests, würde ich mit der StringReader Version gehen. Für weitere Informationen, funktioniert wirklich gut eine Datei in Ihrer Testanordnung eingebettet werden.

realisiert nur die Bibliothek, die ich Linq2Csv verwende, hat Methoden zu tun genau dies

http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

Danke für die Antworten, obwohl

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top