Создайте CSV-файл в качестве программы для чтения потоков "на лету"
-
18-09-2019 - |
Вопрос
Я хотел бы провести модульное тестирование следующего метода
public IEnumerable<T> GetData<T>(StreamReader fileStream) where T : new()
Программа streamreader должна представлять собой файл в формате CSV с определенными названиями столбцов.
Возможно ли создать такие файлы в коде, вместо того чтобы иметь их много в файловой системе для каждого модульного теста?
Есть какие-нибудь идеи?
Обновить:
только что понял, что библиотека, которую я использую Linq2Csv, имеет методы для выполнения именно этого
Решение
Конечно:
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
}
Другие советы
В своем тесте вы могли бы передать метод a StreamReader
это читается из MemoryStream
вместо того, чтобы извлекать из файла или FileStream
.Тот Самый MemoryStream
в свою очередь, может быть заполнен содержимым, похожим на содержимое файла во время проведения тестирования.
В идеале измените подпись на:
public IEnumerable<T> GetData<T>(TextReader fileStream) where T : new()
Тогда вы можете пройти в StringReader
действительно легко.
Альтернативы:
- Включите файлы примеров в свою тестовую сборку, извлекайте потоки с помощью
Assembly.GetManifestResourceStream()
и создатьStreamReader
От этого - Использовать
Encoding.GetBytes(text)
и оберните результат вMemoryStream
, затем создайте StreamReader поверх этого
Для коротких тестов я бы выбрал StringReader
версия.Для получения дополнительных данных встраивание файла в тестовую сборку работает очень хорошо.
только что понял, что библиотека, которую я использую Linq2Csv, имеет методы для этого
http://www.codeproject.com/KB/linq/LINQtoCSV.aspx
хотя спасибо за ответы