如何在.net核心中测试Dapper查询?

Nec*_*ras 8 unit-testing dapper .net-core

使用针对完整.net Framework的代码,我可以模拟IDbConnection并将其指向模拟的DataSet,以便测试我的查询是否正确执行.同样,如果我使用EntityFramework 6,我可以让一个模拟的DbSet返回IQueryables并测试我的数据层逻辑.

但.net核心不支持DataSet(虽然将来可能会改变?).

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

Joe*_*kes 9

不,所有的小巧玲珑都是,在IDbConnection课堂上的扩展方法.

this(IDbConnection)没有InMemory实现(理解SQL字符串).

然而,你最好的选择是,如果你想完全自主地运行它,那么每次运行单元测试时都会启动一个新的sql server.这可以通过Microsoft为sqlserver制作的docker镜像轻松完成:https://hub.docker.com/r/microsoft/mssql-server-linux/

要么...

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

为什么?

Dapper只包含一些有用的功能来生成SQL.它绝不是远离SQL的摘要.而sql只是C#代码的纯文本.它不解析它,也不执行它.因此,你不能单独测试你的sql/dapper代码而不使用它背后的数据库.

实体框架以不同的方式实现.它试图将你想要在数据库中做的所有事情都变成C#代码/抽象(例如IDbCollection).然后他们创建了一个生成sql代码的实现和一个使用内存后备存储的实现.这样您就可以对代码进行单元测试.

微软解决方案

Microsoft经常使用存储库模式进行广告宣传.这基本上是一个昂贵的词汇,用于将所有数据库调用/命令抽象到一个单独的类中并连接这些类,并在代码中使用各处的接口(使用依赖注入).现在,您可以编写单元测试来测试sql查询所需的所有代码,对于此接口,您可以使用mock来测试该方法是否实际被调用.

  • 人力资源管理.如果我不得不使用外部数据源,几乎将其推入集成测试领域,而不是单元测试.如果是这种情况,我会看到可以用SqlLite(http://stackoverflow.com/a/38630232/3691973)完成的工作,而不是每次测试运行都需要重置的完整sql数据库.我现在将此标记为答案,因为似乎还没有完全内部的方法来做到这一点.希望如果DataSets可用,这将变得更容易.因为这似乎是使用Dapper + .net核心的一个重大问题. (2认同)
  • @Necoras 测试 sql 基本上总是集成测试。但是,sql lite 是一个不错的选择。但要知道,如果您使用 sql heavenlh,您可能会使用 sqlLite 不支持的功能或行为不同,并且这不会为您提供生产环境的正确视图。 (2认同)