5

我喜欢这里的建议:

所以问题

它建议使用此代码:

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

4 回答 4

3

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

于 2013-01-16T08:56:08.410 回答
2

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

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

new SettingsReader(new StringReader(settings));
于 2013-01-16T08:55:53.057 回答
2

只需添加一个单独的文件作为程序集嵌入资源并在单元测试中加载它。

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

using (var stream = Assembly.GetExecutingAssembly()
       .GetManifestResourceStream(typeof(YourUnitTest), filename))
using(var reader = new StreamReader(stream))
{
    var fileContent = reader.ReadToEnd();
}
于 2013-01-16T08:56:37.957 回答
0

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

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

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

于 2013-01-16T08:54:59.447 回答