【问题标题】:unit test parser with large string input具有大字符串输入的单元测试解析器
【发布时间】:2013-01-16 17:27:22
【问题描述】:

我喜欢这里的建议:

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

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

【问题讨论】:

    标签: c# unit-testing nunit


    【解决方案1】:

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

    【讨论】:

    • 这不是集成测试,因为它涉及某处的文件吗?这就是我想避免的......
    • 不,它不涉及磁盘上的物理文件。您直接从程序集的资源中读取数据。
    【解决方案2】:

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

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

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

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 谢谢,我想到了这个。我可以将这些数据放入“其他东西”(例如 app.config)中,以便能够在其他单元测试中重用这些“数据块”吗?
    • 我觉得单元测试应该是自包含的。我只会复制“块”。但是如果你想使用块,为什么不把块作为测试类的internal static string chunk1 = @"..."
    • 一旦您必须输入转义码,将字符串放入源代码会变得非常混乱。通常,我们的大型测试字符串中有很多引号,如果它们在源代码中,阅读和编​​辑它们会变得非常烦人。
    • @MatthewWatson:OP 还没有谈到转义码。使用@" 语法,唯一需要转义的字符是双引号,在 XML 中双引号可以与单引号互换!
    【解决方案4】:

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

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

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

    【讨论】:

    • 这不是集成测试,因为它涉及某处的文件吗?这就是我想避免的......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    相关资源
    最近更新 更多