使用Entity Framework和Dapper模拟数据库
我在c#中开发了一个系统,出于具体原因,我们使用实体框架和Dapper:在一些方法中,我们使用Dapper,而在其他方法中,我们使用实体框架。使用Entity Framework和Dapper模拟数据库
我们现在需要开发一些单元测试。我一直在阅读一些方法来模拟数据库进行单元测试。但是,大多数方法似乎都是EF或Dapper特有的。
你可以提出一个很好的方法,我可以同时模拟一个数据库来运行使用EF和Dapper的单元测试吗?
例如:在特定测试中,我将使用Dapper获取数据,然后使用此数据使用EF获取另一个数据。
预先感谢您。
有两种方法可以做到这一点,但可能会更多。
一个根本不涉及数据库。如果你正在谈论单元测试,那么重点关注小部分工作。我的意思是,你嘲笑那些返回数据的调用,让他们返回你的特定测试场景所需的任何数据,然后从那里返回。不涉及数据库,甚至不需要考虑数据库。
为了做到这一点,您的实际数据图层需要建立在接口或抽象类的顶部,您可以模拟以返回任何您想要的内容。
如果你想进一步检查一下真正的数据库中的东西是否正确,那么你正在谈论集成测试,你可以通过直接调用你的各个层来处理,然后检查输出,一切都与真实数据相对应。
如果你采用第一种方法,那么东西就变得更容易了,因为一个位使用EF和另一个Dapper并不重要,重要的只是你模拟的数据以及你对结果运行的任何转换。
需要测试数据库的一个选项是使用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 protected]" />
<row Id="2" Name="supplier-2" ContactName="contact-name-2" ContactPhone="100-200-0002" ContactEmail="[email protected]" />
<row Id="3" Name="supplier-3" ContactName="contact-name-3" ContactPhone="100-200-0003" ContactEmail="[email protected]" />
</data>
</dataset>
</datasets>
</dbTest>
这些元素是可以在测试过程中随时执行的SQL命令。例如。清洁表格,选择实际数据。
元素包含可用于填充表或作为预期数据的数据。
dbsafe支持使用AAA(Arrange,Act,Assert)模式编写单元测试。
排列初始化对象并设置传递给被测试方法的数据的值。
方法ExecuteScripts可用于执行脚本来删除旧记录。方法LoadTables可以用来填充表格。
Act使用排列的参数调用待测试的方法。
断言验证被测试方法的行为是否按预期行为。
方法AssertDatasetVsScript可用于比较数据库中的预期数据与实际数据。
这很简单......除非您希望通过一个测试双推入的数据可以通过另一个(即,如果您通过EF存储并希望通过Dapper进行检索)获得。你需要简单版本还是硬版本(两者都有状态)? – Fenton
是的,我希望通过一个测试双推入的数据可以通过另一个。在一些测试中,我会通过Dapper获取数据,并在同一测试中使用它来获取EF中的另一个数据。 –
你需要什么(IMO)是集成测试来测试数据访问本身。不要试图嘲笑所有的东西。迟早你会碰到嘲笑和真正的东西之间不可逾越的执行差异。 –