Memory 使用内存数据集(或类似数据集)作为源的无Db的DbConnection

Memory 使用内存数据集(或类似数据集)作为源的无Db的DbConnection,memory,dbconnection,Memory,Dbconnection,我试图对一些需要DbConnections来完成工作的.NET类进行单元测试(出于良好的设计原因)。对于这些测试,我在内存中有一些数据作为这些类的输入 内存中的数据可以很容易地表示为DataTable(或包含该DataTable的数据集),但如果另一个类更合适,我可以使用它 如果我能够神奇地获得一个DbConnection,它表示与内存中数据的连接,那么我可以构造我的对象,让它们对内存中的数据执行查询,并确保它们的输出符合预期是否有办法与内存中的数据建立数据库连接?我没有安装任何其他第三方软件的

我试图对一些需要DbConnections来完成工作的.NET类进行单元测试(出于良好的设计原因)。对于这些测试,我在内存中有一些数据作为这些类的输入

内存中的数据可以很容易地表示为DataTable(或包含该DataTable的数据集),但如果另一个类更合适,我可以使用它

如果我能够神奇地获得一个DbConnection,它表示与内存中数据的连接,那么我可以构造我的对象,让它们对内存中的数据执行查询,并确保它们的输出符合预期是否有办法与内存中的数据建立数据库连接?我没有安装任何其他第三方软件的自由来实现这一点,理想情况下,我不想在测试期间触摸磁盘。

TypeMock?(不过,您需要“安装”它)


小心假设数据*可以为您提供适当的测试挂钩——这通常是最糟糕的情况。但是你说的是很好的设计原因,所以我相信这已经涵盖了所有内容:D

而不是使用DbConnection,你可以使用IDbConnection并模拟它吗?我们做了类似的事情,将模拟数据传递给一个数据集。DataSet.CreateDataReader返回从DbDataReader继承的DataTableReader

我们在自己的类似IDbConnection的接口中包装了DbConnection,并在其中添加了ExecuteReader()方法,该方法返回一个实现与DbDataReader相同接口的类。在我们的模拟中,ExecuteReader只返回DataSet.CreateDataReader提供的内容


听起来有点迂回,但建立一个可能包含许多结果集的数据集非常方便。我们以存储的过程命名数据表,它们表示结果,我们的IDbConnection mock根据客户端调用的过程获取正确的数据表。DataTable还实现了CreateDataReader,所以我们可以开始了。

我使用的一种方法是创建内存中的Sqlite数据库。这可以通过简单地将System.Data.SQLite.Core NuGet包拉入单元测试项目来完成,您不需要在其他任何地方安装任何软件

虽然这听起来是一个非常明显的想法,但直到我看到简洁的单元测试,我才想到自己会使用这种技术!请参阅中的“GetSqliteConnection”方法

需要注意的一点是,如果创建内存中的sqlite db并创建和填充表,则在执行测试查询之前,需要小心不要关闭连接,因为打开一个新的内存中连接将使您连接到一个新的内存中数据库,不是你为测试精心准备的数据库!对于我的一些测试,我使用了一个自定义IDbConnection实现来保持连接的开放性,以避免这个陷阱——例如