2010-05-13 46 views
0

如何創建一個單元測試,在asp.net如何創建一個單元測試,更新記錄到數據庫在asp.net

+4

如果您正在更新數據庫中的記錄,它是一個集成測試,而不是單元測試。 – Oded 2010-05-13 09:02:02

+1

「的測試是不是一個單元測試,如果: 它談論到數據庫 它通過網絡進行通信 倒是文件系統 [...]。」 - 邁克爾「修改代碼的工作」 Feathers,2005 [http://www.artima.com/weblogs/viewpost.jsp?thread=126923] – Johnsyweb 2010-05-13 13:22:48

回答

1

雖然在技術上我們不叫這個更新記錄到數據庫'單元測試',但是'集成測試'(如Oded解釋),你可以通過使用單元測試框架(如MSTest(Visual Studio 2008/2010 professional的一部分)或免費的單元測試框架之一)如NUnit。

但是,測試ASP.NET Web項目通常很困難,尤其是當您將所有邏輯放入網頁時。最好的辦法是將所有業務邏輯提取到單獨的層(通常是解決方案中的單獨項目),並從網頁中調用該邏輯。但是也許你已經有了這種分離,這將會很棒。

這樣你也可以在你的測試中調用這個邏輯。對於集成測試,最好有一個單獨的測試數據庫。測試數據庫必須包含已知(和穩定的)數據集(或者完全爲空)。不要使用生產數據庫的副本,因爲數據更改時,測試可能突然失敗。你也應該確保數據庫中由集成測試所做的所有更改都應該回滾。否則,測試數據庫中的數據會不斷變化,這可能會導致您的測試突然失敗。

我在集成測試中始終使用TransactionScope(並且從未在我的生產代碼中)。這確保所有數據都會回滾。以下是對這樣的集成測試可能看起來像一個例子,在使用的MSTest:

[TestClass] 
public class CustomerMovedCommandTests 
{ 
    // This test test whether the Execute method of the 
    // CustomerMovedCommand class in the business layer 
    // does the expected changes in the database. 
    [TestMethod] 
    public void Execute_WithValidAddress_Succeeds() 
    { 
     using (new TransactionScope()) 
     { 
      // Arrange 
      int custId = 100; 

      using (var db = new ContextFactory.CreateContext()) 
      { 
       // Insert customer 100 into test database. 
       db.Customers.InsertOnSubmit(new Customer() 
       { 
        Id = custId, City = "London", Country = "UK" 
       }); 

       db.SubmitChanges(); 
      }     

      string expectedCity = "New York"; 
      string expectedCountry = "USA"; 

      var command = new CustomerMovedCommand(); 
      command.CustomerId = custId; 
      command.NewAddress = new Address() 
      { 
       City = expectedCity, Country = expectedCountry 
      }; 

      // Act 
      command.Execute(); 

      // Assert 
      using (var db = new ContextFactory.CreateContext()) 
      { 
       var c = db.Customers.Single(c => c.Id == custId); 

       Assert.AreEqual(expectedCity, c.City); 
       Assert.AreEqual(expectedCountry, c.Country); 
      } 
     } // Dispose rolls back everything. 
    } 
} 

我希望這可以幫助,但下一次,請更具體一點在你的問題。

+1

很好的解釋。關於'單元測試'我會補充你可以'模擬'你的圖層。原則是儘可能地模擬真實情況下會發生什麼情況,以驗證您的代碼而不做實際的事情:影響您的數據,文件或進程......數據模擬將模擬您的數據庫中將執行的操作但不會連接或訪問數據庫。我想這不是你想要檢查的內容,而是一種從數據庫映射測試(集成測試)中隔離數據訪問測試(單元測試)的方式。模擬通常是'單元測試',因爲環境並不重要。 – JoeBilly 2010-05-13 10:21:29

+0

@JoeBilly:我同意。集成測試應該是最後的手段,您應該嘗試使架構單元測試更友好。但是,這需要付出很多努力(和經驗)。作爲一名顧問,我經常建議經驗較少的團隊開始進行集成測試,因爲我不需要對其架構進行任何更改。 LINQ確實讓事情變得更糟:您永遠不會知道您的O/RM是否支持您編寫的LINQ查詢。正因爲如此,我喜歡看到內存提供者被添加到實體框架中,其行爲與真正的EF數據庫提供者完全一樣。 – Steven 2010-05-13 19:16:56