2011-12-30 53 views
3

在我的單元測試中,我使用AssemblyInitialize,ClassInitializeTestInitialize等配置我的測試。在AssemblyInitialize中,我初始化了一些用於創建服務的單體工廠,一個工作單元和存儲庫(全部通過Unity/Dependency Injection)。在我的TestInitialize中,我清除了他們必須確保每個測試都可以獨立運行的狀態。何處移動構建一次性依賴關係以提高可測試性?

槽Stackoverflow我來到以下文章:Writing Testable CodeHow to Think About the 「new」 Operator with Respect to Unit Testing。我不得不說,他們改變了我對我寫的一些代碼的看法,但我的頭腦仍然嗡嗡作響。

例如,採取以下代碼:

public class MyPresenter : BasePresenter<IMyView> 
{ 
    public MyPresenter(IMyView view) 
     : base(view) 
    { 
    } 

    public void PrepareView() 
    { 
     using (IMyService service = ServiceFactory.Instance.CreateService<IMyService>()) 
     { 
      View.Data = service.GetData(); 
     } 
    } 
} 

這是一個aspx頁面中使用這樣的:

Presenter = new MyPresenter(this); 
if (!IsPostback) 
{ 
    presenter.PrepareView(); 
} 

我應該如何改變這種類型的一種充分考慮到以前的文章?我應該將服務實例傳遞給PrepareView方法嗎?但是,然後我的ASPX頁面必須知道服務和工廠和東西,並在使用後處理服務。

我應該怎樣處理我的Singleton工廠?讓它成爲這個課程的一個屬性,並通過Unity注入它?

回答

3

我發現這種類型的解析依賴不雅,看看Ninject連接依賴關係或注入它們的方式。

你可以看到區別,服務定位器是一個反模式,閱讀這blog也使得更多的清除依賴注入的基本目的和做法,在.NET

+0

Ninject就像文章中提到的Guice一樣?我會看看它。 – 2011-12-30 11:05:09

+1

是的,就是這樣。 – 2011-12-30 11:05:49

-3

我看只有兩種選擇:

  1. 直接注射服務依存關係(但您提到不喜歡解決在ASPX級別的服務)
  2. 傳中,主持人抽象DI容器,然後解決在演示的依賴(但您提到不喜歡這種方式,以及因爲API會不清晰)

我寧願第二個選項,讓每一個主持人是知道哪些依賴它需要的,因爲你正在使用DI容器(Uni ty)爲什麼不擺脫singleton工廠,只需在Unity中註冊所有的工廠,這樣你就可以在需要它的地方訪問它,並且單元測試代碼也沒有任何問題(因爲單體少)。 所以只是通過DI容器在各主持人(考慮您注意的是,不希望保持這一切,ASPX頁面)作爲第二個參數,然後解決所有必需的服務針對特定主持人:

class Presenter 
{ 
    public Presenter(IView, IDiContainerAbstraction container) 
    ... 
} 

Presenter = new MyPresenter(this, unityContainer); 
public void PrepareView()  
{ 
    using (IMyService service = this.unityContainer.Resolve<IMyService>()) 
    { 
     View.Data = service.GetData(); 
    } 
} 

所以:

  • 沒有singletone的依賴,這使得單元測試可以
  • 由於通過接口抽象DI容器,你會在主持人模擬能P將同時進行單元測試
+0

那不是打破MVP模式,具有數據訪問風景? – Magnus 2011-12-30 10:52:14

+0

如果該服務將被多個功能使用會怎樣?我不喜歡在ASPX代碼隱藏中獲取這種代碼的想法..然後,我的Web項目突然有一個WCF庫的引用。然後,我們只是開發人員直接在服務上調用方法的一步(現在,我們使用體系結構驗證來確保每個人都正確使用圖層) – 2011-12-30 10:52:25

+0

我相信主持人訪問數據('presenter.PrepareView()'方法) – sll 2011-12-30 10:53:25