2011-08-18 71 views
1

嗨想伸手向社会上获得的办法为我开展工作的测试驱动开发见解和意见 。为ASP.NET MVC 3测试驱动开发 - 解析XML源文件

我正在解析一个物理XML文件(包含图表和表格数据)的ASP.NET MVC3项目。 首先,应用程序生成xml节点的模型表示。 控制器可以提供最终呈现给包含图表和表格的特定HTML视图的应用程序逻辑,

我在想,我将建立一个模型,它代表了xml,即像数据集,标题,尺寸等类的类,其中 适当的接口。这是正确的做法吗? (请参阅下面的示例xml)

我会写什么样的单元测试? 我会开始访问物理XML文件(可能不是)的单元测试吗? 我应该将fragmlx的xml字符串流入Xdocument吗? (是不是那teting .net代码?) 假设我不想创建具体的XDocument类,如何模拟出对象,例如

我想要做的第一个测试(我认为)是加载xml和测试END_DATE是正确

我有加载xml和返回与属性结束日期的报头的一个类表示的XMLHelper类。

所以我具体的代码看起来大致如下

var dataset = XmlHelper.Load(filePathOrXmlStream); 
var header=dataset.Header; 

Assert.AreEqual("5/06/2011",header.EndDate); 

推测如下XML用于流或文件加载。

XML源

<dataset> 
    <header> 
    <end_date>5/06/2011</end_date> 
    <dimension id="mkt" desc="market"> 
     <item mkt="0" desc="Company A" /> 
     <item mkt="1" desc="Company B" /> 
    </dimension> 
    <dimension id="prd" desc="product"> 
     <item prd="0" desc="Product A " Groups_Total="Segment Totals" Total="Yes" Product="All" grp="Category" /> 
    </dimension> 
    <dimension id="msr" desc="measure"> 
     <item msr="0" tag="ACTIVE_1" desc="Active Products" /> 
    </dimension> 
    <dimension id="tim" desc="time"> 
     <item tim="0" tag="LAST WEEK -52" desc="06/06/10 " /> 
     <item tim="1" tag="LAST WEEK -26" desc="05/12/10 " /> 
     <item tim="2" tag="LAST WEEK 0" desc="05/06/11 " /> 
    </dimension> 
    </header> 
    <data> 
    <dpGroup tim="0"> 
     <dp mkt="0" prd="0" msr="0" tim="0">1031</dp> 
     <dp mkt="1" prd="0" msr="0" tim="0">986</dp> 
    </dpGroup> 
    <dpGroup tim="1"> 
     <dp mkt="0" prd="0" msr="0" tim="1">970</dp> 
     <dp mkt="1" prd="0" msr="0" tim="1">937</dp> 
    </dpGroup> 
    <dpGroup tim="2"> 
     <dp mkt="0" prd="0" msr="0" tim="2">982</dp> 
     <dp mkt="1" prd="0" msr="0" tim="2">955</dp> 
    </dpGroup> 
    </data> 
</dataset> 

回答

0

我首先要做的最重要的测试:

Given model representation of xml, 
when user asks html output, 
controller should produce correct view with chart/table. 

制作并通过该测试会让你想想整体的设计了。之后,它将分支&界限。

0

我认为你正在接近这个问题。有你的进程真的2个独立的步骤:

1)将XML文档转换成一个类表示,模型
2)渲染模型视图

其中TDD应该很好地工作的部分是一步2,因为你在处理对象。然后,您可以按照Taesung Shin所描述的路径行事。如果需要,你可以定义你的对象的接口是什么,并且拥有一个带有StartDate属性的IChartModel,然后你可以模拟,将StartDate设置为你想要的,并且写出关于视图应该是什么的断言在这种情况下。正如Taesung所说,这会帮助你推动你的设计。

的一部分,其中TDD将无法正常工作那么好是在步骤1单元测试照时,你可以完全在内存中运行,并通过定义磁盘上的文件并没有在这方面工作。然后,如果您认为值得付出努力,那么我会做的是获取示例文件,并测试XmlReader对这些文件,以确保您正在阅读您应该的内容,并正确填充步骤2的输入内容。这些不会是“适当的”单元测试,而是更多的集成测试。我倾向于创建一个“愉快的文件”,并提供适当的输入,并可能为潜在的格式错误的案例提供文件。随着时间的推移遇到错误,您可以开始添加新文件。尽管如此,这些测试写起来并不好玩。

如果您要在您的应用程序中创建该XML文件,您可以考虑进行测试,在其中创建这些文件并将其读回,这可能会让您对正在进行的操作有更多的“代码控制”,而不是如果您的设计不断发展,必须随时间维护固定文件。在我看来,分离这个最大的好处是,通过分离你想要的数据在MVC应用程序中的结构和使用方式,从如何从XML文件获取数据,这是您将在2个不同的层中获得分离的好处,并且如果您恰好决定从SQL中提取数据,或者随着时间的推移更改XML文件的结构,则您将在数据访问和数据之间实现可靠的解耦利用。你将有一个领域模型(图表应该是什么),然后可以插入各种数据源。