如何对数据库类进行单元测试

6
这个问题可能被问了很多次,但是还是要解答一下:
我有一个包含数据库连接的类。
打开连接
查询数据库
读取数值
关闭连接
我该如何对这些进行单元测试?
我需要创建一个假的数据库吗? 我猜我可以模拟MySql类(对于c#),但那也是很费力的事情。
其中一些语句是"INSERT INTO",我该怎么办?

3
如果您认为一个问题可能已经被问过了,您应该搜索它 - user229044
3个回答

7

测试难度大的东西通常是紧密耦合或不遵循单一职责原则

首先,拆分您的数据层。查看存储库模式。每个实体(表或视图)都应该有自己的类来获取数据。

使用数据接口而不是特定的驱动程序实现:IDbConnection 而不是 SqlConnection。使用 DbProviderFactory 获取适当的连接实现。然后使用 connection.CreateCommand() 获取命令等。这样做会使测试数据层变得更加容易。请记住,数据层不应该有任何逻辑。它的唯一目的是从数据源加载数据。
但如果您不想改变:针对数据库进行操作是最简单的方法。在每次测试之前删除所有数据并插入新的测试数据(以消除上一个测试期间的任何更改)。

好的,但要注意如果这些单元测试是并行运行的话 - 在这种情况下,第二个测试将会清除第一个测试所需的数据。这可能发生在测试框架被更改时,或者当新版本更改了测试执行顺序时。我最近刚刚调试过这个确切的问题。 - Ed Guiness

2

最简单的方法是创建一个新的测试数据库,执行一些插入查询,然后将结果集存储在列表中,最后使用调试器运行它,以查看是否将结果集存储在您创建的列表中。

源代码中不要有任何插入语句,使用SQL管理工具,在那里进行插入操作,直到您确定连接和所有操作都正常。现在只需暂时记录下所有这些值即可。


0

您可以在本地计算机上运行实时MySql数据库。

我为此制作了一个Nuget包,您可以将其添加到您的项目中:https://github.com/stumpdk/MySql.Server

每次运行测试时它都会启动一个本地MySql服务器。它很快,提供了一个您的团队可以共享的解决方案,而且您不必花时间安装服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接