动态创建csv文件作为StreamReader

时间:2010-02-05 10:55:32

标签: .net unit-testing streamreader

我想对以下方法进行单元测试

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

streamreader必须是CSV格式的文件,具有特定的列名。

是否可以在代码中创建此类文件,而不是必须在文件系统上为每个单元测试创​​建大量文件?

有什么想法吗?

更新:

刚刚实现了我正在使用Linq2Csv的库,有完成这个的方法

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

4 个答案:

答案 0 :(得分:1)

在测试中,您可以传递一个StreamReader方法,该方法从MemoryStream而不是文件或FileStream中读取。反过来,MemoryStream可以填充测试安排期间类似文件内容的内容。

答案 1 :(得分:1)

不确定

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
}

答案 2 :(得分:1)

理想情况下,将签名更改为:

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

然后你可以很容易地传递StringReader

备选方案:

  • 将示例文件嵌入测试程序集中,使用Assembly.GetManifestResourceStream()获取流并从中创建StreamReader
  • 使用Encoding.GetBytes(text)并将结果包装在MemoryStream中,然后构建一个StreamReader

对于简短测试,我会使用StringReader版本。对于更多数据,在测试程序集中嵌入文件非常有效。

答案 3 :(得分:0)

刚刚实现了我正在使用Linq2Csv的库,有完成这个的方法

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

感谢答案