2013-11-09 64 views
1

我一直在試圖弄清楚如何單元測試我的應用程序,但我不太明白如何將所有東西放在一起。ASP.NET MVC,知識庫,工作單元和實體框架單元測試

我遵循John Papa關於PluralSight(SPA)的教程,以完全相同的方式構建了我的模型,存儲庫和工作單元。不幸的是,他沒有提供任何關於我們如何進行單元測試的例子。

我已經和Moq玩過,發現網上很少有鏈接解釋如何這樣做,但不幸的是我無處可去。

一些代碼來提供上下文:

public interface IRepository<T> where T : class 
{ 
    IQueryable<T> GetAll(); 
    T GetById(int id); 
    void Add(T entity); 
    void Update(T entity); 
    void Delete(T entity); 
    void Delete(int id); 
} 

public interface IFeedbackRepository : IRepository<Feedback> 
{ 
    IQueryable<Feedback> GetByFeedbackFor(int id); 
} 

public class FeedbackRepository : EFRepository<Feedback>, IFeedbackRepository 
{ 
    public FeedbackRepository(WebAppDbContext context) : base(context) { } 
    public IQueryable<Feedback> GetByFeedbackFor(int id) 
    { 
     return DbSet.Where(f => f.FeedbackForId == id); 
    } 
} 

public interface IWebAppUow 
{ 
    void Commit(); 

    IFeedbackRepository Feedbacks { get; } 
} 

    public void TestMethod1() 
    { 
    Mock<IWebAppUow> mockUnitOfWork = new Mock<IWebAppUow>(); 

    // THEN ?? 
    } 

編輯:我發現這個鏈接(http://msdn.microsoft.com/en-us/data/dn314429.aspx)解釋如何做,而是直接作用於DbSet。如果有人能夠解釋我們如何修改這個例子來使用UoW和Repository模式,那將是隆重的!

+0

您需要模擬'IWebAppUow'如果你要測試一些代碼,使用它。所以很難回答你的問題,而沒有看到你想測試的實際代碼。 –

+0

比方說,我已經在我的FeedbackRepository如下: 公衆反饋GetByIds(INT feedbackForId,詮釋feedbackFromId) { 回報DbSet.FirstOrDefault( F => f.FeedbackForId == feedbackForId && f.FeedbackFromId == feedbackFromId ); } – teh0wner

+0

然後你可能想嘲笑你的倉庫。 –

回答

1

如果你是單元測試新手,測試EF並不是最好的開始,因爲很難嘲笑它的上下文和所有的API。我會建議遵循一些更簡單的例子。

對於EF單元測試,我建議您檢查Effort frame work。下面是它解釋了在其網站上

的力量是強大的工具,使一個方便的方式來創建 基於實體框架應用程序的自動化測試。它基本上是一個ADO.NET提供程序,它在 上執行一個輕量級進程內存數據庫,而不是傳統的外部數據庫。它提供了一些直觀的幫助程序方法, 可以很容易地將此​​提供程序與現有ObjectContext或 DbContext類一起使用。對現有代碼的簡單添加可能足以創建可在沒有外部數據庫的情況下運行的數據驅動的測試。

+0

我已經做了大量的單元測試,但沒有在ASP.NET或WebApplicatios中進行一般的測試.. – teh0wner

1

所以,如果我已經正確理解您的評論,您想要測試FeedbackRepository類的方法。 讓我們看看如何爲GetByFeedbackFor方法做到這一點。

您正將WebAppDbContext context傳遞到FeedbackRepository。這不是很好。可能你無法測試這段代碼。您應該提取IWebAppDbContext接口並將其傳遞給FeedbackRepository ctor。

我不知道這是什麼代碼背後 return DbSet.Where(f => f.FeedbackForId == id); 所以我只能猜測,這是基類的某些屬性...但如果假設你正在使用的上下文這裏不是DbSet性能測試方法看像接下來的(我認爲這將是不太難重寫它的基礎屬性的情況下(或者甚至可能它會工作作爲爲)):

public void ShouldReturnFeedbacksForCorrectId() 
{ 
    var contextMock = new Mock<IWebAppDbContext>(); 

    // fill expected for example with 2 entities with FeedbackForId == 1 
    IQueryable<Feedback> expected = InitWithDataSomehow(); 
    contextMock.Setup(i => i.Feedbacks).Returns(expected); 
    var repositoryUnderTest = new FeedbackRepository(contextMock); 

    IQueryable<Feedback> actualResult = repositoryUnderTest.GetByFeedbackFor(1); 

    Assert.AreEqual(expected, actualResult); 
} 
+0

您已理解正確。我將提取WebAppDbContext到一個接口,看看是否可行!我會盡快回復你。 – teh0wner

+0

My WebAppDbContext擴展了在Identity中使用的IdentityContext ..我將如何繼續這麼做? – teh0wner

1

我不會單元測試你的存儲庫中,的DbContext是一個具體的類依賴於一個真實的數據庫,據我所知,我不能用Moq來嘲笑它。所以我所做的就是關注單元測試使用存儲庫的代碼並改爲模擬存儲庫。

要真正測試你的倉庫,我會去集成測試。

+0

使用存儲庫的代碼將是控制器使用的Uow。你建議單元測試嗎? – teh0wner

+0

我不確定那個架構。我熟悉的架構是服務將取決於UoW和存儲庫,您可以嘲笑這兩者並單元測試服務方法。 –

+0

我遵循約翰帕帕在hia SPA pluralSight教程中使用的體系結構。你有正在討論的人的教程嗎?我必須承認我從來沒有進入我的建築,我通常儘可能簡單地保持它,但是通過這個項目,我試圖從一開始就把它做好。可維護性,可擴展性和便於新來者在跳 – teh0wner