我们可以在XML数据源的数据驱动测试中读取内部xml节点吗?

时间:2013-11-08 16:20:39

标签: c# xml unit-testing

如果我有这个代码示例,使用XML作为数据源:

[DeploymentItem("Ita_ResultArea_CompaniesList\\snapshot.xml")]
[DataSource("Microsoft.VisualStudio.TestTools.DataSource.XML",
            "|DataDirectory|\\Ita_ResultArea_CompaniesList\\snapshot.xml", 
            "Test", DataAccessMethod.Sequential)]
[TestMethod]
public void Ita_ResultArea_Tdd_MinimalRequest()
{
    var input = TestContext.DataRow["Input"];
    Assert.IsNotNull(input);
}

为什么我无法从 TestContext.DataRow [“输入”] 读取内部节点?

下一步是XML内容:

<TestData>

<Test>
  <Input>
    <Query>
      <Expression>laser &lt;IN&gt; FTXT</Expression>
    </Query>
  </Input>
  <Output>
    <someOut>ss</someOut>
  </Output>
</Test>

<Test>
  <Input>
    <Query>
      <Expression>laser &lt;IN&gt; FTXT</Expression>
    </Query>
  </Input>
  <Output>
    <someOut>ss</someOut>
  </Output>
</Test>

</TestData>

我在MSDN论坛中发现了一些线程,无法读取多级xml文件,只是简单的例子,如下所示:

<TestData>
 <Test>
  <sample1>some text</sample1>
  <sample2>some test</sample2>
 </Test>
</TestData>

通过这种方式 TestContext.DataRow [“sample1”] 可以正常工作。


更新 结果我用下一个方式处理我的xml文件(查看源xml):

<TestData>
  <Test>
    <Expression1>laser &lt;IN&gt; FTXT</Expression1>
    <someOut1>ss<someOut1>
    <Expression2>laser &lt;IN&gt; FTXT</Expression2>
    <someOut2>ss<someOut2>
  </Test>
  <!-- another test data-->
  <Test>
    <Expression1>lorem ipsum</Expression1>
    <someOut1>found<someOut1>
    <Expression2>oneWord</Expression2>
    <someOut2>found<someOut2>
    <Expression3>long data</Expression3>
    <someOut3>found<someOut3>
  </Test>
</TestData>

正如您所见,这不是一个非常好的解决方案,但是手工制作的解决方法: 我将xml的内部级别加入到第一级,只检索有意义的数据。 因此,在.NET代码中运行测试时,必须手动恢复包含测试数据的完整层次结构。

我的同事批评了我的公司,但替代方案只是 BClaydon 提出。

似乎微软多年来一直不关心这种限制。

1 个答案:

答案 0 :(得分:1)

我不确定您的单元测试有多广泛,但如果您要验证您的XML是否符合某些控件的要求?数据集然后您将要使用数据集。我目前正在对SSRS报告进行单元测试,以反对已知的好消息&#39;事务查询,SQL表或数据集。数据集中的XML被分解为具有节点名称的逻辑数据表。您现在可以调用节点的名称(数据表),行索引,列名称,单元格等。