Erstellen Sie CSV-Datei als Stream on the fly
-
18-09-2019 - |
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
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 eineStreamReader
aus, dass - Verwenden Sie
Encoding.GetBytes(text)
und wickeln Sie das Ergebnis in einemMemoryStream
, 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