2015-11-02 101 views
0

由於應用程序的業務規則有時相當複雜,因此我正在處理一個具有大量業務邏輯代碼的中型(ASP.NET MVC)項目。單元測試現有的代碼庫

我用以下解決方案結構:

  • ClientName.Web(MVC網站)
  • ClientName.Interfaces(定義業務邏輯的方法)
  • ClientName.BusinessLogic(應該可能被稱爲「服務」,因爲我在這裏使用實體框架)
  • ClientName.Model(包含EF的DbContext類,枚舉等)
  • ClientName.Tests(單元測試項目)

爲了訪問(MSSQL)數據庫,我使用實體框架v。6.

現在,大多數業務邏輯方法已經被編寫和正常工作。然而,代碼庫的大小現在已經到了一個地步,我正在修復一個功能,然後再打破另一個非常不理想的功能。我從一開始就應該做的是編寫業務邏輯方法的單元測試,採用TDD方法。由於這個原因,我想嘗試爲現有的(和未來的)業務邏輯方法引入單元測試,並且我已經閱讀了關於Moq和我發現有趣的this blog post on MSDN。但是有一個問題:我的DbContext被注入業務邏輯類(我運行一個 DbContext每個http請求),這些用於執行CRUD操作。業務邏輯類看起來是這樣的:

public class PersonBusiness 
{ 
    private readonly MyContext _myContext; 

    public PersonBusiness(MyContext myContext) 
    { 
     _myContext = myContext; 
    } 

    public IEnumerable<PersonResponsibility> GetResponsibilities() 
    { 
     return _myContext.PersonResponsibilities.Where(x => x.IsActive).ToList(); 
    } 

    public void CreatePerson(string name) 
    { 
     Person person = new Person() { Name = name }; 
     _myContext.People.Add(person); 
     _myContext.SaveChanges(); 
    } 
} 

(這只是一個非常簡單例子,一些BL方法是愚昧的複雜,用正表等閱讀)據

據我所知,我需要一個假的DbContext來測試哪個Moq可以幫助我,但是我沒有得到的是我如何使用假的DbContext和我的商業邏輯類,因爲它預計的是MyContext。有沒有一種方法可以使用我現有的方法,但用虛假的上下文來代替?

此外,這是一個相當大的數據庫,有20 - 25個表。我是否必須爲每個表手動創建模擬數據,對於我運行的每個測試,還是有其他方式「模擬」它?一些測試將涉及7個不同的表,這使得大量的手動模擬數據:-)

任何幫助/提示是非常感謝。

在此先感謝。

回答

2

而不是通過MyContext,爲您的上下文類創建一個IMyContext接口,並通過它。然後你可以模擬你對Context類的期望。

至於嘲笑你的數據,20-25表並不是一個真正的大型模式。您可以建立一個共享模擬數據庫,並根據您的測試需要對其進行處理。

+0

感謝您的回答科林:-)現在,這很簡單,只是嘗試將我的'MyContext'切換到一個可以正常工作的接口。再次感謝! –

+0

只是一個關於嘲諷的後續問題:我已經開始手動創建模擬數據(用參考和屬性等編寫每個類),並通過4個表格使用3個小時僅使用3個小時來輸入虛擬數據。那是真的嗎? :-O這是一個意大利麪的噩夢,設置正確的參考它似乎.. –

+0

@BoMortensen這是一個不平凡的工作量,當然。我並沒有真正意識到任何可以加速這個過程的事情。 您可以編寫一個工具來從真實世界的測試數據中生成模擬數據,但我會想象成本最終會超過好處 –