【发布时间】:2011-01-15 19:08:43
【问题描述】:
我有一个输出简单报告文件的类。它从 XML 文件中读取一些记录 ID 号:每个用于查找存储在数据库中的匹配记录。然后它将每条记录的详细信息写入 CSV 文件。
我想知道 - 组织它以便易于测试但遵循封装原则的最佳方式是什么?我认为最好避免与文件系统交互,除非绝对必要,所以我正在处理 Stream 对象。在进行单元测试时,我可以使用部分模拟对象来覆盖读取或写入文件的位。
我也不确定何时/何地处理流而不使单元测试变得棘手。看来我可能不得不将流公开给单元测试。
我的项目使用 NHibernate 进行数据访问,使用 Spring .NET 进行依赖注入,使用 Rhino.Mocks 进行单元测试。
目前我有类似的东西:
public class ReportBiz
{
//Access to repository, populated by Spring
internal ICardRequestDAO CardRequestData { get;set;}
//This normally returns a FileStream containing data from the XML file. When testing this is overridden by using a Rhino.Mocks partial mock and returns a MemoryStream
internal virtual Stream GetSourceStream()
{
//Load file and return a Stream
...
}
//This normally returns a FileStream where CSV data is saved. When testing this is overridden by using a Rhino.Mocks partial mock and returns a MemoryStream
internal virtual Stream GetOutputStream()
{
//Create file where CSV data gets saved and return a Stream
...
}
public void CreateReportFile()
{
Stream sourceStream = GetSourceStream();
...
//Create an XmlDocument instance using the stream
//For each XML element, get the corresponding record from the database
//Add record data to CSV stream
...
}
}
使用某种自定义工厂或其他东西并将流传递给构造函数会更好吗?但是如果涉及到一些业务逻辑呢,例如文件名是根据查询结果确定的?
还是说整个文件访问都不是问题?
抱歉,如果我遗漏了一些明显的东西。如有任何建议,我将不胜感激。
【问题讨论】:
-
我需要问:你的 XML 是做什么的?它是否只包含指向数据库记录的键列表?
-
除了数据库键,它还包含我需要的与记录相关的其他三个字段。这些也会在报告中使用。
标签: c# .net unit-testing stream class-design