2015-05-22 112 views
0

我正在與TDD合作,一切進展順利。當我到達我的實際存儲庫時,雖然我不知道如何測試它。單元測試實體框架庫

考慮下面的代碼 - 這是我知道我想要寫的,但是如何在不進行集成測試的情況下以第一種方式在測試中解決這個問題。

public class UserDb : IUserDb 
{ 
    public void Add(User user) 
    { 
     using (var context = new EfContext()) 
     { 
      context.Users.Add(user); 

      context.SaveChanges(); 
     } 
    } 
} 

forsvarir下面的鏈接是我想作爲答案。我該怎麼做?

http://romiller.com/2012/02/14/testing-with-a-fake-dbcontext/

+0

戴夫嗨, 我不知道是否有必要測試下得到這個代碼...你寧願測試的EntityFramework功能比你的業務邏輯... – sebastian87

+0

@ sebastian87我想你的意思周圍的其他方式。您寧願測試您的業務邏輯而不是EF功能。 – sed

+0

我沒有英文,我叫馬鈴薯。 但你說得對,我就是這麼想的。 – sebastian87

回答

1

什麼是你希望通過測試的第三方工具來實現?您可以嘲笑上下文var fakeContext = A.Fake<IDbContext>();,然後聲明嘗試寫入數據庫。 A.CallTo(() => fakeContext.SaveChanges()).MustHaveHappened();

上面的例子使用了FakeItEasy mocking庫。

+0

我不想測試第三方工具 - 只是我的Add方法。你的建議聽起來沿着正確的路線。雖然我使用RhinoMocks。雖然IDbContext並不存在,但我不確定如何爲實體框架上下文創建這樣的接口。 –

+0

一般來說,沒有必要「測試第三方工具」,但我發現EF常常在運行時意外或意外崩潰(例如,無法轉換爲SQL的LINQ查詢)。打電話給我偏執狂 - 或者甚至對EF沒有足夠的經驗 - 但是當我TDD'ing數據訪問代碼時,我想知道代碼是否會實際運行在真正的SQL數據庫上。 – prgmtc

+0

@prgmtc我絕對同意你的偏執狂。我傾向於寫一些針對EF的集成測試。從nHibernate來到EF後,我傾向於將所有EF位放入事務中,而我根本找不到一種有效的方法來嘲笑它們。也就是說,我的第一次測試通常是解耦的單元測試,這樣我就可以確定邏輯已經被排除在業務層的數據訪問之外(我至少在這方面表現得很好)。 – THBBFT

1

通常的回答這些題型是:

  • 隔離難以測試的依賴關係(的EF上下文)
  • 提供測試中的假執行驗證SUT
  • 的正確行爲

這一切都是有道理的,當你有有趣的邏輯來測試你的系統在測試。對於您的具體情況,存儲庫看起來像是您的乾淨域和EF-aware邏輯之間的非常簡單的抽象。好,保持他們的方式。這也意味着它並沒有真正做很多工作。我建議你不要打擾編寫單獨的單元測試(包裝EF DbContext看起來像額外的工作,可能不會減重)。

請注意,我並不是說你不應該測試此代碼:我經常傾向於使用真實數據庫(即通過集成測試)來測試這些瘦存儲庫。對於所有使用這些存儲庫的代碼,我會堅持通過向被測系統提供假存儲庫來進行單元測試。這樣我就可以覆蓋我的存儲庫代碼並測試EF實際上是以正確的方式與我的數據庫交談,而間接使用這些存儲庫的所有其他測試都很好,隔離並且閃電般快速。