Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.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
C# 如何模拟DataReader进行单元测试_C# - Fatal编程技术网

C# 如何模拟DataReader进行单元测试

C# 如何模拟DataReader进行单元测试,c#,C#,我的数据访问层中有一个方法可以执行映射。该方法接受DataReader,并将数据映射到适当的域对象属性。有没有一种好方法可以模拟DataReader,这样我就可以在不影响物理数据库的情况下对映射方法执行单元测试?是的,不要使用DataReader,但是,或者,然后模拟任何你想要的东西。幸运的是,DataReader实现了IDataReader接口 不要在代码中依赖DataReader,而是使用IDataReader。然后,在测试中,您可以替换您自己返回虚拟数据的实现,或者使用类似或类似的模拟框架

我的数据访问层中有一个方法可以执行映射。该方法接受DataReader,并将数据映射到适当的域对象属性。有没有一种好方法可以模拟DataReader,这样我就可以在不影响物理数据库的情况下对映射方法执行单元测试?

是的,不要使用
DataReader
,但是,或者,然后模拟任何你想要的东西。

幸运的是,
DataReader
实现了
IDataReader
接口

不要在代码中依赖
DataReader
,而是使用
IDataReader
。然后,在测试中,您可以替换您自己返回虚拟数据的实现,或者使用类似或类似的模拟框架来创建存根并分配返回值


根据您在代码中“获取”数据读取器的方式,您可能需要进行一些重构。您想要的是在构造函数(首选)中或通过属性“注入”这样的外部依赖项,以便类的使用者可以替换
IDataReader
的任何实现。(这种替换也是将参数/属性声明为抽象而不是具体类型的原因。)这被称为。

的一种形式。如果要模拟IDataReader以返回记录列表,可以创建一个实现IDataReader的类并重写它的一些方法(如Read()和Indexer)。此外,还需要一个变量来保存当前行的记录,并需要一个变量来保存列表值。下面是执行此操作的示例代码:

public class MockDataReader : IDataReader
{
    private int _rowCounter = 0;
    private List<Dictionary<string,object>> _records = new List<Dictionary<string,object>>();

    public MockDataReader(List<Dictionary<string,object>> records)
    {
        _records = records;
    }

    public bool Read()
    {
        _rowCounter++;
        if (_rowCounter < _records.Count) return true;
        return false;
    }

    public object this[string name]
    {
        get { return _records[_rowCounter][name]; }
    }
}
公共类MockDataReader:IDataReader
{
私有整数_行计数器=0;
私有列表_记录=新列表();
公共MockDataReader(列表记录)
{
_记录=记录;
}
公共bool Read()
{
_行计数器++;
if(_rowCounter<_records.Count)返回true;
返回false;
}
公共对象[字符串名称]
{
获取{return}记录[_rowCounter][name];}
}
}
然后,要使用此类,可以使用以下代码:

var itemsList = new List<Dictionary<string, object>>();
for (int i = 0; i < 5; i++)
{
    var num = i + 1;
    var items = new Dictionary<string, object>();
    items.Add("Id", num);
    items.Add("FirstName", "MyFirstName" + num);
    items.Add("LastName", "MyLastName" + num);
    itemsList.Add(items);
}


var result = new MockDataReader(itemsList); 
var itemsList=newlist();
对于(int i=0;i<5;i++)
{
var num=i+1;
var items=newdictionary();
添加(“Id”,num);
添加(“名字”、“我的名字”+num);
添加(“LastName”、“MyLastName”+num);
项目列表。添加(项目);
}
var结果=新的MockDataReader(itemsList);

不是一个完全证明的方式,但工作。希望它能有所帮助:)

我不会创建实际的类来模拟
IDataReader
,而是+1来显示需要设置什么样的模拟对象才能实现。