【问题标题】:How to read hierarchical test data from xml or csv file for C# tests?如何从 xml 或 csv 文件中读取分层测试数据以进行 C# 测试?
【发布时间】:2016-03-16 08:40:50
【问题描述】:

我使用 Microsoft Entity Framework 并有一些嵌套实体

祖父母、父母、孩子

在 C# 测试中,我希望能够从 xml 文件中读取 GrandParents 数组,包括他们的后代,例如(假代码示例:)

[TestMethod]
[DataSource("myTestData.xml")] 
public void MyTest(){
       List<GrandParent> grandParents = TestContext.GetEntityList(GrandParent.class);
}

<?xml version="1.0" encoding="utf-8" ?>
<TestData>
<GrandParent>
  <name>GrandParent_1</name>
  <Parent>
    <name>Parent_1.1</name>
    <Child>
      <name>Child_1.1.1</name>         
    </Child>
  </Parent>
</GrandParent>

<GrandParent>
  <name>GrandParent_2</name>
  <Parent>
    <name>Parent_2.1</name>
    <Child>
      <name>Child_2.1.1</name>         
    </Child>
  </Parent>
  <Parent>
    <name>Parent_2.2</name>
    <Child>
      <name>Child_2.2.1</name>         
    </Child>
  </Parent>
</GrandParent>
<TestData>

DataSource 注释不支持上述语法,我只能找到从 DataSource 读取平面数据的示例。 https://msdn.microsoft.com/en-us/library/ms182527.aspx

似乎不支持读取分层数据并将该数据转换为实体对象树。

是否有一种简单的方法可以从 xml 数据源创建实体对象树以进行测试?也许像 Java 中的 Unitils (http://unitils.org/tutorial-database.html),但对于 .Net?理想情况下,xml 文件不需要包含实体的所有属性:只需要指定测试中使用的那些实体属性。

相关问题

【问题讨论】:

  • 显示GrandParent 类及其子类的代码。
  • 谢谢。我更正了xml文件。我的真正问题更复杂,上面的例子只是为了说明问题。

标签: c# xml entity-framework test-data


【解决方案1】:

您可以使用XmlSerializer 并序列化您的实体以供以后反序列化吗?

https://msdn.microsoft.com/en-us/library/58a18dwa(v=vs.110).aspx

【讨论】:

  • 这可能是一条路。我希望已经存在一个支持“从(不完整)xml测试数据导入模拟”的测试库。
【解决方案2】:

我找到了 Effort - 实体框架单元测试工具,它似乎不支持 xml,但至少允许读取 csv 数据以填充内存测试数据库:

https://effort.codeplex.com/wikipage?title=Startup%20data%20from%20CSV%20files&referringTitle=Tutorials

【讨论】:

    【解决方案3】:

    您提到了 CSV 作为一个可能的选项,所以我将提到我创建了一个 T4 模板,它可以读取 CSV 文件并生成数据列表,主要用于单元测试。 您必须自己处理对象层次结构,因此这可能不适合您的需要。但是...您可以进行这样的测试(仅填充一级后代以进行说明):

    [TestMethod]
    public void TestMethod1()
    {
        StaticDataLibrary library = StaticDataLibrary.Current;
        var people = library.GetList<Person>("people.csv");
        var grandparents = people
            .Where(p => p.ParentId == null)
            .Select(gp => new GrandParent()
            {
                Id = gp.Id,
                Name = gp.Name,
                Children = people
                    .Where(c => c.ParentId == gp.Id)
                    .Select(c => new Person()
                    {
                        Id = c.Id,
                        Name = c.Name
                    }).ToList()
    
            })
            .ToList();
    
        Mock<IDataAccess> dataAccess = new Mock<IDataAccess>();
        dataAccess.Setup(m => m.GetGrandParents())
            .Returns(grandparents);
    
        // invoke the method that uses the data and make assertions...
    }
    

    列表将从 CSV 文件生成(cmets 也可以),例如:

    Id, ParentId, Name
    // Grand Parents
    "1", null, "GrandParent_1"
    "2", null, "GrandParent_2"
    
    // Parents
    "1.1", "1", "Parent_1.1"
    "2.1", "2", "Parent_2.1"
    "2.2", "2", "Parent_2.2"
    
    // Grand Children
    "1.1.1", "1.1", "Child_1.1.1"
    "2.1.1", "2.1", "Child_2.1.1"
    "2.2.1", "2.2", "Child_2.2.1"
    

    在测试执行期间不会读取 CSV 文件。 T4 模板在设计时创建 StaticDataLibrary,这是为了避免在测试执行期间访问文件系统。

    如果您有兴趣,我创建了一个NuGet package,它将模板(VB 或 C#)安装到您的项目中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多