如何在 .net core 中测试 Dapper 查询?
How can I test Dapper queries in .net core?
使用针对完整 .net Framework 的代码,我可以模拟 IDbConnection 和 point it at a mocked DataSet in order to test that my queries are executing correctly. Similarly if I were using EntityFramework 6 I could have a mocked DbSet return IQueryables 并针对它测试我的数据层逻辑。
但是 .net 核心 doesn't support DataSets (though that may change in the future?).
同时,有没有办法创建一个对象集合,dapper 可以使用 IDbConnection 查询这些对象以测试查询逻辑?
不,所有 dapper 都是 IDbConnection
class 之上的扩展方法。
此 (IDbConnection
)(理解 SQL 字符串)没有 InMemory 实现。
然而,如果您想 运行 它完全自主,最好的选择是每次 运行 单元测试时启动一个新的 sql 服务器。使用 Microsoft 为 sql 服务器制作的 docker 图像可以轻松完成此操作:https://hub.docker.com/r/microsoft/mssql-server-linux/
或...
或迁移到 Entity framework,它们允许您针对内存后备存储进行单元测试。
为什么?
Dapper 只包含一些有用的功能来生成 SQL。它绝不是从 SQL 中抽象出来的。 sql 只是 C# 代码的纯文本。它不解析它,也不执行它。因此,您无法在不使用代码背后的数据库的情况下对 sql/dapper 代码进行单元测试。
Entity framework 的做法不同。它试图将您希望在数据库中执行的所有操作都转换为 C# code/abstraction(例如 IDbCollection)。然后他们制作了 1 个生成 sql 代码的实现和一个使用内存后备存储的实现。这样你就可以对你的代码进行单元测试了。
微软解决方案
Microsoft 经常使用 Repository Pattern 做广告。这基本上是一个昂贵的词,用于将所有数据库 calls/commands 抽象为单独的 class 并连接这些 classes,并在代码中的任何地方使用接口(使用依赖注入)。现在您可以编写单元测试来测试您对 sql 查询的所有代码,对于此接口,您可以创建一个模拟来测试该方法是否实际被调用。
另一个测试数据库访问代码(查询等)的选项是使用本地 SQL 数据库实例,但每次您可以在单元测试设置中启动数据库事务时都重新创建它,并且回滚拆除中的事务。根据您选择的隔离级别,这也解决了并行执行测试/固定装置时的并发问题。
使用针对完整 .net Framework 的代码,我可以模拟 IDbConnection 和 point it at a mocked DataSet in order to test that my queries are executing correctly. Similarly if I were using EntityFramework 6 I could have a mocked DbSet return IQueryables 并针对它测试我的数据层逻辑。
但是 .net 核心 doesn't support DataSets (though that may change in the future?).
同时,有没有办法创建一个对象集合,dapper 可以使用 IDbConnection 查询这些对象以测试查询逻辑?
不,所有 dapper 都是 IDbConnection
class 之上的扩展方法。
此 (IDbConnection
)(理解 SQL 字符串)没有 InMemory 实现。
然而,如果您想 运行 它完全自主,最好的选择是每次 运行 单元测试时启动一个新的 sql 服务器。使用 Microsoft 为 sql 服务器制作的 docker 图像可以轻松完成此操作:https://hub.docker.com/r/microsoft/mssql-server-linux/
或...
或迁移到 Entity framework,它们允许您针对内存后备存储进行单元测试。
为什么?
Dapper 只包含一些有用的功能来生成 SQL。它绝不是从 SQL 中抽象出来的。 sql 只是 C# 代码的纯文本。它不解析它,也不执行它。因此,您无法在不使用代码背后的数据库的情况下对 sql/dapper 代码进行单元测试。
Entity framework 的做法不同。它试图将您希望在数据库中执行的所有操作都转换为 C# code/abstraction(例如 IDbCollection)。然后他们制作了 1 个生成 sql 代码的实现和一个使用内存后备存储的实现。这样你就可以对你的代码进行单元测试了。
微软解决方案
Microsoft 经常使用 Repository Pattern 做广告。这基本上是一个昂贵的词,用于将所有数据库 calls/commands 抽象为单独的 class 并连接这些 classes,并在代码中的任何地方使用接口(使用依赖注入)。现在您可以编写单元测试来测试您对 sql 查询的所有代码,对于此接口,您可以创建一个模拟来测试该方法是否实际被调用。
另一个测试数据库访问代码(查询等)的选项是使用本地 SQL 数据库实例,但每次您可以在单元测试设置中启动数据库事务时都重新创建它,并且回滚拆除中的事务。根据您选择的隔离级别,这也解决了并行执行测试/固定装置时的并发问题。