ASP的测试驱动开发.NET MVC 3 -解析XML源文件



我想接触社区,以获得见解和建议关于我正在进行的工作的测试驱动开发方法。

我正在做一个ASP。NET MVC3项目,在物理XML文件(包含图表和表格数据)中进行解析。首先,应用程序生成xml节点的模型表示。控制器是用来执行应用程序逻辑的,
最终呈现为带有图表和表格的特定HTML视图。

我认为我将建立一个模型,代表xml类,如数据集,标题,维度等适当的接口。这是正确的方法吗?(请参阅下面的示例xml)

我应该写什么样的单元测试?我是否应该从访问物理XML文件的单元测试开始(可能不会)?我应该将xml字符串片段流式传输到Xdocument中吗?(这不是在测试。net代码吗?)假设我不想创建具体的XDocument类,那么如何模拟对象呢?例如

我想做的第一个测试(我认为)是加载xml并测试end_Date是否正确

我有一个XMLHelper类,它加载xml并返回带有属性结束日期的头的类表示形式。

所以我的具体代码大概是这样的
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>

我会先做最重要的测试:

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

进行并通过测试也会让你思考整体设计。之后,它将是branch &div。

我认为你处理问题的方法是正确的。在你的过程中有两个独立的步骤:

1)将XML文档转换为类表示,即模型
2)渲染模型到视图

TDD应该很好地工作的部分是第2步,因为您正在处理对象。然后你可以沿着泰成信勾勒的路径走。如果需要,您可以定义对象的接口是什么,并拥有一个带有StartDate属性的IChartModel,然后您可以模拟它,将StartDate设置为您想要的任何内容,并编写关于在这种情况下视图应该为真的断言。正如Taesung所说,这将帮助你推动你的设计。

TDD不能很好地工作的部分是在步骤1中。当您可以完全在内存中工作时,单元测试就会大放异彩,而根据定义,磁盘上的文件在这种情况下不能很好地工作。如果您认为值得这样做,那么我接下来要做的就是提供一些示例文件,并针对这些文件测试XmlReader,以确保您正在阅读应该阅读的内容,并正确填充第2步的输入。这些不是"适当的"单元测试,而是更多的集成测试。我倾向于创建一个"快乐文件",包含适当的输入,并可能为潜在的畸形案例创建文件。随着时间的推移遇到错误时,可以开始添加新文件。但是,编写这些测试并不有趣。

如果您打算在您的应用程序中创建XML文件,您可以考虑在创建这些文件并读取它们的地方进行测试,这可能会给您更多的"代码控制",而不是必须随着时间的推移维护固定的文件,如果您的设计发展。

最大的利益就会得到分离,在我看来,这是通过将如何对数据进行组织和使用MVC应用程序,从如何得到数据从一个XML文件,你将会造福分居在两个不同的层次,和如果你决定把数据从SQL,或者改变你的XML文件的结构随着时间的推移,你会有固体之间的解耦数据访问和数据利用率。您将拥有一个域模型(图表应该是什么样子),然后可以将各种数据源插入其中。

最新更新