繁体   English   中英

使用Entity Framework和Dapper模拟数据库

[英]Mocking database using Entity Framework and Dapper

我正在用c#开发一个系统,出于特定原因,我们正在使用Entity Framework和Dapper:在某些方法中,我们使用Dapper,而在其他方法中,我们使用Entity Framework。

现在,我们需要开发一些单元测试。 我一直在阅读一些模拟数据库以进行单元测试的方法。 但是,大多数方法似乎专用于EF或Dapper。

您能建议一个好的方法,让我同时模拟一个数据库,以运行使用EF AND Dapper的单元测试吗?

例如:在一个特定的测试中,我将使用Dapper获取数据,然后使用此数据通过EF获取另一个数据。

先感谢您。

您可以通过两种方式执行此操作,但可能更多。

一个根本不涉及数据库。 如果您正在谈论单元测试,则将重点放在较小的工作上。 我的意思是,您模拟返回数据的调用,使它们返回特定测试场景所需的任何数据,然后从那里返回。 不涉及数据库,甚至无需考虑数据库。

为了做到这一点,您的实际数据层需要建立在接口或抽象类之上,并且您可以模拟这些数据层以返回所需的任何内容。

如果您想进一步检查并检查真实数据库中的内容正确无误,那么您正在谈论集成测试,您可以通过直接调用各个层然后检查输出(一切都与真实数据相反)来应对。

如果您采用第一种方法,则事情变得更容易,因为一点点使用EF和另一个Dapper都无关紧要,重要的是仅模拟数据以及对结果进行的任何转换。

需要测试数据库的一个选项是使用dbsafe。 https://github.com/dbsafe/dbsafe它也有一个NuGet包。

“如果DAL的实现或使用的技术发生变化,则可以重用测试。”

dbsafe提供了用于填充数据库,执行SQL命令以及将预期数据与实际数据进行比较的方法。

它使用一个或多个带有SQL脚本和数据集的xml输入文件。

<?xml version="1.0" encoding="utf-8" ?>
<dbTest>
  <scripts>
    <script name="delete-products">
      DELETE [dbo].[Product];
    </script>

    <script name="delete-categories">
      DELETE [dbo].[Category];
    </script>
  </scripts>

  <datasets>
    <dataset name="categories" setIdentityInsert="true" table="Category">
      <data>
        <row Id="1" Name="category-1" />
        <row Id="2" Name="category-2" />
        <row Id="3" Name="category-3" />
      </data>
    </dataset>

    <dataset name="suppliers" setIdentityInsert="true" table="Supplier">
      <data>
        <row Id="1" Name="supplier-1" ContactName="contact-name-1" ContactPhone="100-200-0001" ContactEmail="email-1@test.com" />
        <row Id="2" Name="supplier-2" ContactName="contact-name-2" ContactPhone="100-200-0002" ContactEmail="email-2@test.com" />
        <row Id="3" Name="supplier-3" ContactName="contact-name-3" ContactPhone="100-200-0003" ContactEmail="email-3@test.com" />
      </data>
    </dataset>  
  </datasets>
</dbTest>  

元素是可以在测试期间随时执行的SQL命令。 例如清洁表,选择实际数据。

元素包含可用于填充表或作为预期数据的数据。

dbsafe支持使用AAA(排列,行为,声明)模式编写单元测试。

Arrange初始化对象并设置传递给被测方法的数据的值。

方法ExecuteScripts可用于执行脚本以删除旧记录。 方法LoadTables可用于填充表。

Act使用已安排的参数调用被测方法。

断言验证被测方法的行为是否符合预期。

方法AssertDatasetVsScript可用于比较数据库中的预期数据与实际数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM