2

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

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

流读取器需要是 CSV 格式的文件,具有特定的列名。

是否可以在代码中创建这样的文件,而不是在每个单元测试的文件系统上都有很多文件?

有任何想法吗?

更新:

刚刚意识到我正在使用 Linq2Csv 的库,有方法可以做到这一点

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

4

4 回答 4

1

在您的测试中,您可以传递StreamReader从 aMemoryStream而不是从文件或FileStream. 反过来MemoryStream,可以在测试安排期间填充类似于文件内容的内容。

于 2010-02-05T11:01:46.747 回答
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
}
于 2010-02-05T11:02:27.027 回答
1

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

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

然后你可以StringReader很容易地通过。

备择方案:

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

对于简短的测试,我会选择该StringReader版本。对于更多数据,在您的测试程序集中嵌入一个文件非常有效。

于 2010-02-05T11:02:33.640 回答
0

刚刚意识到我正在使用 Linq2Csv 的库,有方法可以做到这一点

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

谢谢你的回答

于 2010-02-05T11:05:13.497 回答