2017-04-20 21 views
3

將代碼定位到完整的.net框架,我可以模擬IDbConnection和point it at a mocked DataSet以測試我的查詢是否正確執行。同樣,如果我使用的EntityFramework 6我可以有一個mocked DbSet返回IQueryables並測試我的數據層邏輯。如何在.net內核中測試Dapper查詢?

但是.net核心doesn't support DataSets(雖然這可能會改變in the future?)。

與此同時,是否有一種方法可以創建一個對象的集合,使用IDbConnection可以查詢乾淨,以測試查詢邏輯?

回答

5

不,所有的小巧玲瓏都是IDbConnection類別的擴展方法。

這裏沒有InMemory實現(IDbConnection)(理解SQL字符串)。

但是,最好的辦法是,如果你想完全自主運行它,那麼每次運行單元測試時都會啓動一個新的sql服務器。這可以很容易地與泊塢窗圖像,微軟已經爲SQLSERVER之後所做的:https://hub.docker.com/r/microsoft/mssql-server-linux/

或...

或遷移到實體框架,它們允許你進行單元測試對內存中的後備存儲。

爲什麼?

Dapper只包含一些有用的功能來生成SQL。它決不是從SQL中抽象出來的。而sql只是C#代碼的純文本。它不解析它,也不執行它。因此你不能單元測試你的sql/dapper代碼而不使用它後面的數據庫。

實體框架做不同。它試圖將您想要在數據庫中執行的所有操作都轉換爲C#代碼/抽象(例如IDbCollection)。然後,他們製作了一個生成sql代碼的實現和一個使用內存後備存儲的實現。這樣你可以單元測試你的代碼。

微軟的解決方案

微軟經常發佈使用Repository Pattern。這對於將所有數據庫調用/命令抽象爲單獨的類並連接這些類以及在代碼中使用各處接口(使用依賴注入)來說基本上是一個昂貴的詞。現在你可以編寫單元測試來測試你的所有代碼對sql查詢的期望值,對於這個接口你可以模擬測試這個方法是否被實際調用。

+2

Hrm。如果我不得不使用外部數據源,那麼它幾乎可以將其推入集成測試領域,而不是單元測試。如果是這樣的話,我會看看SqlLite(http://stackoverflow.com/a/38630232/3691973)可以做些什麼,而不是每個測試運行都需要重置的完整sql數據庫。我現在將此標記爲答案,因爲似乎還沒有完全內部的方式來做到這一點。希望這將變得更容易,如果/當數據集可用時。因爲這似乎是使用Dapper + .net核心的重大問題。 – Necoras

+1

@Necoras測試sql基本上總是一個集成測試。但是,是的,sql lite是一個很好的選擇。但是要知道,如果你使用sql,那麼你可能會使用sqlLite不支持的特性或者行爲不同的特性,並且這不會給你一個正確的生產環境視圖。 –

+0

是的,我知道它可能與我們的生產系統有點不同,這就是爲什麼我希望在內存表現上更直接。幸運的是,我們大部分的sql都非常簡單。希望在我們的用例中,SqLite和Sql Server之間不會存在重大的分歧問題。 – Necoras