2017-10-09 80 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可用於比較數據庫中的預期數據與實際數據。

相關問題