2017-10-09 82 views
0

我在c#中开发了一个系统,出于具体原因,我们使用实体框架和Dapper:在一些方法中,我们使用Dapper,而在其他方法中,我们使用实体框架。使用Entity Framework和Dapper模拟数据库

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

你可以提出一个很好的方法,我可以同时模拟一个数据库来运行使用EF和Dapper的单元测试吗?

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

预先感谢您。

+0

这很简单......除非您希望通过一个测试双推入的数据可以通过另一个(即,如果您通过EF存储并希望通过Dapper进行检索)获得。你需要简单版本还是硬版本(两者都有状态)? – Fenton

+0

是的,我希望通过一个测试双推入的数据可以通过另一个。在一些测试中,我会通过Dapper获取数据,并在同一测试中使用它来获取EF中的另一个数据。 –

+0

你需要什么(IMO)是集成测试来测试数据访问本身。不要试图嘲笑所有的东西。迟早你会碰到嘲笑和真正的东西之间不可逾越的执行差异。 –

回答

0

有两种方法可以做到这一点,但可能会更多。

一个根本不涉及数据库。如果你正在谈论单元测试,那么重点关注小部分工作。我的意思是,你嘲笑那些返回数据的调用,让他们返回你的特定测试场景所需的任何数据,然后从那里返回。不涉及数据库,甚至不需要考虑数据库。

为了做到这一点,您的实际数据图层需要建立在接口或抽象类的顶部,您可以模拟以返回任何您想要的内容。

如果你想进一步检查一下真正的数据库中的东西是否正确,那么你正在谈论集成测试,你可以通过直接调用你的各个层来处理,然后检查输出,一切都与真实数据相对应。

如果你采用第一种方法,那么东西就变得更容易了,因为一个位使用EF和另一个Dapper并不重要,重要的只是你模拟的数据以及你对结果运行的任何转换。

0

需要测试数据库的一个选项是使用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可用于比较数据库中的预期数据与实际数据。

相关问题