动态创建 csv 文件作为 StreamReader

发布于 2024-08-20 13:05:28 字数 448 浏览 4 评论 0原文

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

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

Streamreader 需要是 CSV 格式的文件,并具有特定的列名称。

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

有什么想法吗?

更新:

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

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

I would like to unit test the following method

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

The streamreader needs to be a file in CSV format, with particular column names.

Is it possible to create such files in code, rather than having to have lots of them on the file system for each unit test?

Any ideas?

UPDATE:

just realised the library I am using Linq2Csv, has methods for doing exactly this

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

·深蓝 2024-08-27 13:05:28

当然:

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
}

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
}
血之狂魔 2024-08-27 13:05:28

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

In your test, you could pass the method a StreamReader that reads from a MemoryStream instead of from a file or FileStream. The MemoryStream in turn can be populated with content that resembles the file contents during the test arrangement.

黯然#的苍凉 2024-08-27 13:05:28

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

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

然后您可以非常轻松地传入 StringReader

替代方案:

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

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

Ideally, change the signature to:

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

Then you can pass in a StringReader really easily.

Alternatives:

  • Have sample files embedded in your test assembly, fetch streams with Assembly.GetManifestResourceStream() and create a StreamReader from that
  • Use Encoding.GetBytes(text) and wrap the result in a MemoryStream, then build a StreamReader over that

For short tests, I would go with the StringReader version. For more data, embedding a file in your test assembly works really well.

再浓的妆也掩不了殇 2024-08-27 13:05:28

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

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

感谢您的回答

just realised the library I am using Linq2Csv, has methods for doing exactly this

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

thanks for the answers though

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文