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

时间:2017-04-20 21:58:13

标签: unit-testing .net-core dapper

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

然而.net核心doesn't support DataSets(虽然这可能会改变in the future?)。

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

2 个答案:

答案 0 :(得分:7)

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

没有InMemory实现(IDbConnection)(理解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经常使用Repository Pattern进行广告宣传。这基本上是一个昂贵的词汇,用于将所有数据库调用/命令抽象到一个单独的类中并连接这些类,并在代码中使用各处的接口(使用依赖注入)。现在,您可以编写单元测试来测试sql查询所需的所有代码,对于此接口,您可以使用模拟来测试该方法是否实际被调用。

答案 1 :(得分:0)

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