2013-02-12 61 views
0

我有一堆WebPartBase我試圖調用一個方法。一些方法在UI上調用控件。我想以某種方式對這些控件進行存根控制,以便在試圖設置它們的值時不會拋出異常。有誰知道這樣做的好方法嗎?如果它們被初始化,它也可以,但我不確定如何在不運行Web服務器的情況下初始化它們。如何針對WebPartBase類編寫單元測試並模擬控件?

我的測試代碼如下所示。 IntializeOnAdd()KPIWebPartBaseKPIWebPartBase繼承WebPartBase的方法。

 [TestMethod] 
     public void InvokeAllWidgets() 
     { 
      var user = new User("adminqaphi"); 
      user.CustomerID = TestConfig.ClientID; 

      var classes = typeof(KPIWebPartBase) 
       .Assembly 
       .GetTypes() 
       .Where(t => t.IsSubclassOf(typeof(KPIWebPartBase)) && !t.IsAbstract); 
      foreach (var c in classes) 
      { 
       Console.WriteLine(c.Name); 
       var instance = (KPIWebPartBase)Activator.CreateInstance(c); 
       foreach (var billingMetric in Enum.GetValues(typeof(BillingMetric))) 
       { 
        instance.CurrentUser = user; 
        instance.BillingMetric = (BillingMetric)billingMetric; 

        if (instance is StartEndKPIWebPartBase) 
        { 
         var startEndKPI = (StartEndKPIWebPartBase)instance; 
         startEndKPI.StartDate = new DateTime(2007, 1, 1); 
         startEndKPI.EndDate = new DateTime(2008, 1, 1); 
        } 

        instance.InitializeOnAdd(); 
       } 
      } 
     } 

回答

0

我會爲他們創建的接口(如果可能的話),並使用moq創造嘲笑或存根的外部依賴。

InvokeAllWidgets()測試有什麼行爲?

迴應評論: 我認爲你應該模擬數據庫,以便你測試代碼(單元)的「內部」邏輯。否則,你將開始測試數據庫,我想這不是你想要的。如果您確實調用了數據庫,那麼如果其中的某些數據發生變化會發生什麼?這會不會通過你的測試?如果是這樣,我認爲你正在進行集成測試,而不是單元測試。在單元測試中,嘗試模擬所有外部依賴並測試自己的邏輯(可能出錯?)。如果你的代碼不允許你測試它,然後改變它!

+0

它調用數據庫來獲取一些值。然後它將值分配給窗體上的控件。當它將值分配給表單域時,我的測試立即崩潰。 – 2013-02-13 18:36:21

+0

我想你應該模擬數據庫,以便測試代碼(單元)的「內部」邏輯。 – Jocke 2013-02-14 06:51:02