2013-01-16 17 views
3

我喜欢这里的建议:单元测试解析器大字符串输入

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

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

回答

1

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

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

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

听起来很有趣。你可以添加一些更多的肉此为纽带,没有帮助。我非常感谢 – cs0815

+0

好吧只是觉得:http://stackoverflow.com/questions/6080596/how-can-i-load-this-file-into-an-nunit-test – cs0815

0

最简单的方法是只将文件添加到单元测试项目,并使用它。 设置文件属性为“建设行动= none”和“复制到输出目录=如果更新复制”,然后你可以假设该文件是在同一文件夹作为单元测试可执行文件。

我发现,把大串到源代码本身就更难,因为你必须在源代码格式字符串的方式读 - 特别是如果文本包含必须转义字符。有更好的文本文件与所有的数据,恕我直言。

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

+2

这不是一个集成测试,因为它涉及到某个文件的某个地方?这就是我想避免的... – cs0815

1

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

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

new SettingsReader(new StringReader(settings)); 
+0

谢谢我想到了这一点。我可以将这些数据放入“其他东西”(例如app.config)中以便能够在其他单元测试中重用这些“数据块”吗? – cs0815

+0

我觉得单元测试应该是自包含的。我只会复制“块”。但是,如果你想使用块,为什么不把块作为测试类的内部静态字符串chunk1 = @“...”'。 –

+1

只要你必须输入转义码,将字符串放入源代码就会非常麻烦。通常,我们的大型测试字符串中有很多引号,如果它们在源代码中,读取和编辑它们变得非常烦人。 –

2

一种常见的方法是将与测试数据添加文件到单元测试组件的资源和读取在单元测试的数据。

+0

会,因为它涉及到一个文件某处这不会是一个集成测试?这就是我会想要避免... – cs0815

+2

不,它不涉及在磁盘上的物理文件。你直接从您的程序集的资源读取数据。 –