单元测试解析器与大字符串输入

时间:2013-01-16 08:52:00

标签: c# unit-testing nunit

我喜欢这里的建议:

SO question

建议使用此代码:

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>"));

我只是想知道最好的做法是“提供”大型测试字符串(即要解析的文件的几行)。

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

var settings = @"
<settings>
  <a>1</a>
  <b>2</b>
</settings>";

new SettingsReader(new StringReader(settings));

答案 2 :(得分:2)

只需将单独的文件添加为程序集嵌入式资源,然后将其加载到单元测试中。

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

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

答案 3 :(得分:0)

最简单的方法是将文件添加到单元测试项目中,然后使用它。 将文件的属性设置为“Build Action = None”和“Copy to Output Directory = Copy if newer”,然后您可以假设该文件与单元测试可执行文件位于同一文件夹中。

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

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