具有大字符串输入的单元测试解析器

本文关键字:单元测试 输入 字符串 | 更新日期: 2023-09-27 17:53:25

我喜欢这里的建议:

所以问题

建议使用以下代码:

public class SettingsReader()
{
    public SettingsReader(System.IO.StreamReader reader)
    {
        // read contents of stream...
    }
}
// In production code:
new SettingsReader(new StreamReader(File.Open("settings.xml")));
// In unit test:
new SettingsReader(new StringReader("<settings>dummy settings</settings>"));

我只是想知道最佳实践是"提供"大型测试字符串(即要解析的文件的几行)。

具有大字符串输入的单元测试解析器

一种常见的方法是将包含测试数据的文件添加到单元测试程序集的资源中,并在单元测试中读取该数据。

只需添加一个单独的文件作为汇编嵌入资源,并在单元测试中加载。

Assebmly使用。GetManifestResourceStream方法加载嵌入的文件。

using (var stream = Assembly.GetExecutingAssembly()
       .GetManifestResourceStream(typeof(YourUnitTest), filename))
using(var reader = new StreamReader(stream))
{
    var fileContent = reader.ReadToEnd();
}

对于单元测试,最好直接在代码中显示测试数据,而不是使用嵌入的资源文件。

var settings = @"
<settings>
  <a>1</a>
  <b>2</b>
</settings>";
new SettingsReader(new StringReader(settings));

最简单的方法就是向单元测试项目添加一个文件,然后使用它。将文件的属性设置为"Build Action = None"answers"Copy to Output Directory = Copy if newer",然后你就可以假设该文件与单元测试可执行文件在同一个文件夹中。

我发现将一个大字符串放入源代码本身会使其更难阅读,因为您必须在源代码中格式化字符串的方式-特别是如果文本包含必须转义的字符。有一个包含所有数据的文本文件要好得多。

如果您想在单元测试项目之间共享测试数据,您可以这样做:将文件放在源代码控制下的某个地方,然后向项目添加到文件的链接(而不是文件的副本)。这样,您只需要维护原始源文件的一个副本。