【问题标题】:How can I test Dapper queries in .net core?如何在 .net 核心中测试 Dapper 查询?
【发布时间】:2017-04-20 21:58:13
【问题描述】:

使用针对完整 .net 框架的代码,我可以模拟 IDbConnection 和 point it at a mocked DataSet 以测试我的查询是否正确执行。同样,如果我使用的是 EntityFramework 6,我可以有一个 mocked DbSet 返回 IQueryables 并针对它测试我的数据层逻辑。

但是 .net core doesn't support DataSets(尽管这可能会改变 in the future?)。

与此同时,有没有办法创建一个对象集合,dapper 可以使用 IDbConnection 查询以测试查询逻辑?

【问题讨论】:

    标签: unit-testing .net-core dapper


    【解决方案1】:

    不,所有 dapper 都是 IDbConnection 类之上的扩展方法。

    没有针对此 (IDbConnection) 的 InMemory 实现(可以理解 SQL 字符串)。

    但是,如果您想完全自主地运行它,最好的办法是在每次运行单元测试时启动一个新的 sql 服务器。这可以通过微软为 sqlserver 制作的 docker 镜像轻松完成:https://hub.docker.com/r/microsoft/mssql-server-linux/

    或者...

    或者迁移到实体框架,它们允许您针对内存中的后备存储进行单元测试。

    为什么?

    Dapper 仅包含一些用于生成 SQL 的有用功能。它绝不是从 SQL 中抽象出来的。而 sql 只是 C# 代码的纯文本。它不解析它,也不执行它。因此,如果不使用其背后的数据库,您就无法对您的 sql/dapper 代码进行单元测试。

    实体框架的做法不同。它试图将您想要在数据库中执行的所有操作转换为 C# 代码/抽象(例如 IDbCollection)。然后他们制作了 1 个生成 sql 代码的实现和一个使用内存后备存储的实现。这样您就可以对代码进行单元测试。

    微软的解决方案

    Microsoft 经常使用Repository Pattern 做广告。这基本上是一个昂贵的词,用于将所有数据库调用/命令抽象为一个单独的类并连接这些类,并在代码中的任何地方使用接口(使用依赖注入)。现在,您可以编写单元测试来测试您对 sql 查询所期望的所有代码,对于这个接口,您可以模拟来测试该方法是否被实际调用。

    【讨论】:

    • 人力资源部。如果我将不得不使用几乎将其推入集成测试领域而不是单元测试领域的外部数据源。如果是这种情况,我将看看使用 SqlLite (stackoverflow.com/a/38630232/3691973) 之类的东西可以做什么,而不是使用每次测试运行都需要重置的完整 sql 数据库。我暂时将其标记为答案,因为似乎还没有完全内部的方法来做到这一点。如果/当数据集可用时,希望这会变得更容易。因为这似乎是使用 Dapper + .net 核心的一个重大问题。
    • @Necoras testing sql 基本上总是一个集成测试。但是,是的,sql lite 是一个不错的选择。但要知道,如果您使用 sql 相当天堂,您可能会使用 sqlLite 不支持的功能或行为不同的功能,这不会让您对生产环境有正确的看法。
    • 是的,我知道它的功能可能与我们的生产系统有点不同,这就是为什么我希望在内存中进行更直接的表示。谢天谢地,我们的大部分 sql 都非常简单。希望在我们的用例中,SqlLite 和 Sql Server 之间不会出现明显的分歧问题。
    • 为单元测试启动外部资源似乎太过分了。
    • @PhilPeace 是的,但是否也在代码单元测试中测试 sql 查询?因为这些 sql 查询没有在代码中解析,而实际上只由外部 sql server/resource 解析?
    【解决方案2】:

    另一个测试数据库访问代码(查询等)的选项是使用本地 SQL 数据库实例,但每次您可以在单元测试设置中启动数据库事务时重新创建它,并在拆卸时回滚事务.根据您选择的隔离级别,这还解决了并行执行测试/夹具时的并发问题。

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 2021-07-22
      • 2021-09-07
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多