簡體   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