Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 单元测试-删除SqlDataReader_Unit Testing_Nunit_Sqldatareader_Stub_Stub Data Generation - Fatal编程技术网

Unit testing 单元测试-删除SqlDataReader

Unit testing 单元测试-删除SqlDataReader,unit-testing,nunit,sqldatareader,stub,stub-data-generation,Unit Testing,Nunit,Sqldatareader,Stub,Stub Data Generation,我们有一个n层web应用程序,它从SQL Server提取数据。我们的数据访问逻辑返回一个SqlDataReader,其数据随后用于创建业务对象(也称为数据传输对象) 我们希望构建单元测试来检查解释这些SqlDataReader对象返回的数据以构建业务对象的代码 因此,在单元测试期间,似乎有必要构建存根来替换SqlDataReader对象。正如可能相当典型的那样,我们的SqlDataReader对象通常返回多个记录集,每个记录集都有多行 这是明智的做法吗 我们应该如何构建这些存根对象 非常感谢

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

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

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

  • 这是明智的做法吗
  • 我们应该如何构建这些存根对象
  • 非常感谢


    Griff

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

    要测试这一点,第一步是让数据访问逻辑返回一个
    IDataReader
    ,而不是
    SqlDataReader
    -
    SqlDataReader
    实现
    IDataReader
    ,因此没有问题

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

    编辑

    为了向您的测试提供一组样本数据,我建议对您使用的每个数据表使用一个,将数据表的创建保持在一个专用的位置。然后可以在每个
    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();
    

    假设我们的一个IDataReader对象返回有关客户的详细信息:rs1=个人详细信息;rs2=权限;rs3-xxx等。大多数测试将使用此作为默认数据集。某些测试可能希望使用这些值中的大部分,但会覆盖数据表中的某些属性。这有多容易?几乎和继承一样……我不确定我是否理解——你是指一个用于多个结果集的数据读取器,还是一组数据读取器?无论如何,我已经更新了我的答案。