Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.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# 如何对依赖于数据库的行为进行单元测试#_C#_Database_Unit Testing - Fatal编程技术网

C# 如何对依赖于数据库的行为进行单元测试#

C# 如何对依赖于数据库的行为进行单元测试#,c#,database,unit-testing,C#,Database,Unit Testing,我有一个与DB通信的C#应用程序。我想测试一些依赖于数据库的函数。所以我想确保DB在每次测试运行之前都有一个初始状态。我使用NUnit测试我的应用程序。有什么方法可以恢复DB的初始状态? 谢谢你的帮助 您可以使用内存中的SQLite数据库来创建测试数据库环境 您应该使用模拟程序(插件),如: 或 这些程序可以在测试期间模拟数据库之类的数据源。您不需要对与数据库的交互进行单元测试。这种类型的测试称为集成测试。为此,您可以使用常用的测试工具(NUnit、MSTest等),但最好是在单独的项目中分离


我有一个与DB通信的C#应用程序。我想测试一些依赖于数据库的函数。所以我想确保DB在每次测试运行之前都有一个初始状态。我使用NUnit测试我的应用程序。有什么方法可以恢复DB的初始状态?

谢谢你的帮助

您可以使用内存中的SQLite数据库来创建测试数据库环境


您应该使用模拟程序(插件),如:


这些程序可以在测试期间模拟数据库之类的数据源。

您不需要对与数据库的交互进行单元测试。这种类型的测试称为集成测试。为此,您可以使用常用的测试工具(NUnit、MSTest等),但最好是在单独的项目中分离集成测试,使用专用的测试数据库,并在回滚的事务(例如,use)中运行这些测试。这可以确保数据不会更改,并且测试的行为是可预测的,这一点非常重要


如果可以,请尝试以这样一种方式设计应用程序,即很容易伪造所有外部源(如数据库),以便运行(通常更快)单元测试。然而,这并不容易。尤其是在处理尚未设计为可测试性的现有应用程序时。在这种情况下,我发现集成测试是一个很好的开始。

正如其他人所说,在单元测试中,您不能依赖DB及其结构。 因此,我将创建一个接口,该接口对使用它的组件(也称为DB抽象层)隐藏DB,然后为了单元测试而实现内存中的DB

内存中DB的表可以使用一个简单的C#哈希表为每个DB表实现


这种分离还有一个好处,就是在您的代码中,在DB和使用它的组件之间创建一个分离(例如,从MySQL移动到Oracle等)。

考虑切换到MbUnit进行集成测试。它有非常方便的回滚属性,完全符合您的需要


MbUnit具有与NUnit相同的用于标记测试类和方法的属性。因此,您只需更改using指令并引用MbUnit dll。

单元测试通常意味着单独测试代码。。。模拟数据库怎么样?有时我需要测试一个存储过程,所以没有办法模拟它。有时,一个测试需要大量的数据(不是任意的,而是复杂的连接)在数据库中。因此,在db中准备一次数据并一直使用它要比模拟存储库容易得多。但对于单元测试,您似乎混合了单元测试和集成测试。这个问题有数百万个重复:这是最好、最实用的答案!