C# 单元测试数据库方法

C# 单元测试数据库方法,c#,unit-testing,C#,Unit Testing,我目前正在从事一个利用SQLite数据库的c#项目。对于这个项目,我被要求进行单元测试,但有人告诉我,单元测试不应该涉及外部文件,比如用于测试的数据库文件,相反,测试应该模拟数据库 如果我有一个测试数据库中是否存在某种东西的函数,那么如何用单元测试来测试这种方法呢 对于SQLite,您可以使用。您可以通过插入数据来暂存数据库,然后对其运行测试。对于SQLite,您可以使用。您可以通过插入数据来暂存数据库,然后对其运行测试。我认为使用依赖于数据库信息的单元测试是一个非常糟糕的主意。 另外,我认为使

我目前正在从事一个利用SQLite数据库的c#项目。对于这个项目,我被要求进行单元测试,但有人告诉我,单元测试不应该涉及外部文件,比如用于测试的数据库文件,相反,测试应该模拟数据库


如果我有一个测试数据库中是否存在某种东西的函数,那么如何用单元测试来测试这种方法呢

对于SQLite,您可以使用。您可以通过插入数据来暂存数据库,然后对其运行测试。

对于SQLite,您可以使用。您可以通过插入数据来暂存数据库,然后对其运行测试。

我认为使用依赖于数据库信息的单元测试是一个非常糟糕的主意。 另外,我认为使用sqlite进行单元测试是个坏主意

您需要测试对象协议,因此如果您在测试中需要一些东西,您应该在测试中的某个地方创建它们(通常在设置时)

由于很难删除持久性,常用的方法是使用SQLite,但总是在单元测试中创建所需的内容


检查此链接这将更有帮助我认为

我认为使用依赖于数据库信息的单元测试是一个非常糟糕的主意。 另外,我认为使用sqlite进行单元测试是个坏主意

您需要测试对象协议,因此如果您在测试中需要一些东西,您应该在测试中的某个地方创建它们(通常在设置时)

由于很难删除持久性,常用的方法是使用SQLite,但总是在单元测试中创建所需的内容


检查此链接我认为这会更有帮助

一般来说,如果避免使用外部文件,并且所有操作都是用代码完成的,那么生活会更轻松。没有说“不应该”的规则,有时候外部依赖更合理。但只有在你考虑过如何不拥有它,并意识到权衡是什么之后


其次,Bryan所说的是一个很好的选择,也是我以前使用过的选择。

一般来说,如果避免使用外部文件,并且所有事情都是用代码完成的,那么生活会更轻松。没有说“不应该”的规则,有时候外部依赖更合理。但只有在你考虑过如何不拥有它,并意识到权衡是什么之后


其次,Bryan所说的是一个很好的选择,也是我以前使用过的选择。

在使用数据库的应用程序中,至少会有一个组件负责与该数据库通信。该组件的单元测试可能涉及模拟数据库,但使用真实数据库测试该组件是完全有效的(并且通常是可取的)。毕竟,组件应该封装并代理与该数据库的通信——单元测试应该对此进行测试。有许多策略可以方便地执行这样的单元测试——请参阅侧栏中的相关SO问题列表以获取示例

避免在单元测试中访问数据库的一般规定适用于非数据库组件。由于非数据库组件的数量通常远远超过与数据库相关的组件,因此绝大多数单元测试不应该涉及数据库。事实上,如果这种非数据库组件需要对数据库进行有效测试,那么很可能存在设计问题——可能是关注点分离不当

因此,单元测试应该避免数据库的原则通常是正确的,但这不是一条绝对的规则。它只是一个(强有力的)指导方针,有助于构建复杂系统。过于严格地遵循规则会使充分测试封装外部系统的“边界”组件变得非常困难——在这些地方,bug很容易隐藏起来!因此,当一个单元测试需要一个数据库时,人们真正应该问自己的问题是:被测试的组件是否可以合法地直接访问数据库,还是应该与另一个负有此责任的组件协作


同样的道理也适用于在单元测试中使用外部文件和其他资源。

在使用数据库的应用程序中,至少有一个组件负责与该数据库通信。该组件的单元测试可能涉及模拟数据库,但使用真实数据库测试该组件是完全有效的(并且通常是可取的)。毕竟,组件应该封装并代理与该数据库的通信——单元测试应该对此进行测试。有许多策略可以方便地执行这样的单元测试——请参阅侧栏中的相关SO问题列表以获取示例

避免在单元测试中访问数据库的一般规定适用于非数据库组件。由于非数据库组件的数量通常远远超过与数据库相关的组件,因此绝大多数单元测试不应该涉及数据库。事实上,如果这种非数据库组件需要对数据库进行有效测试,那么很可能存在设计问题——可能是关注点分离不当

因此,单元测试应该避免数据库的原则通常是正确的,但这不是一条绝对的规则。它只是一个(强有力的)指导方针,有助于构建复杂系统。过于严格地遵循规则会使充分测试封装外部系统的“边界”组件变得非常困难——在这些地方,bug很容易隐藏起来!因此,当一个单元测试需要一个数据库时,人们真正应该问自己的问题是:被测试的组件是否可以合法地直接访问数据库,还是应该与另一个负有此责任的组件协作

同样的道理也适用于在单元测试中使用外部文件和其他资源
[PreSqlExecute("SetupTestUserDetails.sql")]
[PostSqlExecute("CleanupTestUserDetails.sql")]
public void UpdateUserNameTest()
    {