gpt4 book ai didi

unit-testing - 单元测试 - stub SqlDataReader

转载 作者:行者123 更新时间:2023-12-03 23:21:01 25 4
gpt4 key购买 nike

我们有一个从 SQL Server 提取数据的 n 层 Web 应用程序。我们的数据访问逻辑返回一个 SqlDataReader,然后将其数据用于创建我们的业务对象(也称为数据传输对象)。

我们希望构建单元测试来检查我们的代码,这些代码解释这些 SqlDataReader 对象返回的数据以构建我们的业务对象。

因此,似乎有必要在单元测试期间构建 stub 来替换 SqlDataReader 对象。可能相当典型的是,我们的 SqlDataReader 对象通常返回多个记录集,每个记录集包含多行。

  • 这是一个明智的努力吗?
  • 我们应该如何构建这些 stub 对象?

  • 提前谢谢了

    格里夫

    最佳答案

    自动化测试基本上总是一个明智的努力:)

    能够对此进行测试的第一步是让您的数据访问逻辑返回 IDataReader。而不是 SqlDataReader - SqlDataReader实现 IDataReader ,所以那里没有问题。

    在您的单元测试中,您可以手动构建和填充 DataTable对象,并调用 dataTable.CreateDataReader()获取 IDataReader传递到被测对象中。

    编辑

    要为您的测试提供一组样本数据,我建议使用 ObjectMother对于您使用的每个数据表,将数据表的创建保存在一个专用位置。然后您可以在每个 ObjectMethod 上放置方法类以强类型的方式更新某些数据。例如:

    public class PersonalDetailsBuilder
    {
    private DataTable _dataTable;

    public PersonalDetailsBuilder CreateNewTable()
    {
    this._dataTable = new DataTable("CustomerPersonalDetails")
    {
    Columns =
    {
    new DataColumn("CustomerId", typeof(int)),
    new DataColumn("CustomerName", typeof(string))
    }
    };

    return this;
    }

    public PersonalDetailsBuilder AddStandardData(int numberOfRows = 3)
    {
    foreach (int i in Enumerable.Range(1, numberOfRows + 1))
    {
    this.AddRow(i, "Customer " + i);
    }

    return this;
    }

    public PersonalDetailsBuilder AddRow(int customerId, string customerName)
    {
    this._dataTable.Rows.Add(customerId, customerName);

    return this;
    }

    public IDataReader ToDataReader()
    {
    return this._dataTable.CreateDataReader();
    }
    }

    ...然后您可以像这样使用它来获取数据阅读器:
    IDataReader customerDetailsReader = new PersonalDetailsBuilder()
    .CreateNewTable()
    .AddStandardData()
    .AddRow(17, "Customer 17")
    .ToDataReader();

    关于unit-testing - 单元测试 - stub SqlDataReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9908621/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com