我想对以下方法进行单元测试
public IEnumerable<T> GetData<T>(StreamReader fileStream) where T : new()
流读取器需要是 CSV 格式的文件,具有特定的列名。
是否可以在代码中创建这样的文件,而不是在每个单元测试的文件系统上都有很多文件?
有任何想法吗?
更新:
刚刚意识到我正在使用 Linq2Csv 的库,有方法可以做到这一点
我想对以下方法进行单元测试
public IEnumerable<T> GetData<T>(StreamReader fileStream) where T : new()
流读取器需要是 CSV 格式的文件,具有特定的列名。
是否可以在代码中创建这样的文件,而不是在每个单元测试的文件系统上都有很多文件?
有任何想法吗?
更新:
刚刚意识到我正在使用 Linq2Csv 的库,有方法可以做到这一点
在您的测试中,您可以传递StreamReader
从 aMemoryStream
而不是从文件或FileStream
. 反过来MemoryStream
,可以在测试安排期间填充类似于文件内容的内容。
当然:
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
}
理想情况下,将签名更改为:
public IEnumerable<T> GetData<T>(TextReader fileStream) where T : new()
然后你可以StringReader
很容易地通过。
备择方案:
Assembly.GetManifestResourceStream()
创建一个StreamReader
Encoding.GetBytes(text)
并将结果包装在 a 中MemoryStream
,然后在其上构建一个 StreamReader对于简短的测试,我会选择该StringReader
版本。对于更多数据,在您的测试程序集中嵌入一个文件非常有效。