2011-08-29 66 views
2

我想通過實際點擊數據庫來測試我的真實數據。我實際上正在測試我的Repository類。這是我正在做的一個例子;通過點擊數據庫測試實體框架數據

/// <summary> 
/// Summary description for Country 
/// </summary> 
[TestClass] 
public class Country { 

    public Country() { 
     _countryRepo = new CountryRepository(); 
    } 

    private ICountryRepository _countryRepo; 

    [TestMethod] 
    public void db_should_return_at_least_one_country_as_approved_all() { 

     //Act 
     var model = _countryRepo.GetAll(); 

     //Assert 
     Assert.IsTrue(model.Count() >= 1); 
    } 

    [TestMethod] 
    public void db_should_return_at_least_one_country_as_approved_true() { 

     //Act 
     var model = _countryRepo.GetAll(ApprovalStatus.Approved); 

     //Assert 
     Assert.IsTrue(model.Count() >= 1); 
    } 

    [TestMethod] 
    public void db_should_return_Turkey_as_country_name_by_id() { 

     //Act 
     var model = _countryRepo.GetSingle(1000); 

     //Assert 
     Assert.AreEqual<string>("Turkey", model.CountryName); 

    } 

    [TestMethod] 
    public void db_should_return_Turkey_as_country_name_by_countryISO3166Code() { 

     //Act 
     var model = _countryRepo.GetSingle("TR"); 

     //Assert 
     Assert.AreEqual<string>("Turkey", model.CountryName); 

    } 

    [TestMethod] 
    public void db_should_return_Turkey_as_country_name_by_GUID() { 

     //Act 
     var model = _countryRepo.GetSingle(Guid.Parse("9AF174A6-D0F7-4393-AAAD-B168BADEDB30")); 

     //Assert 
     Assert.AreEqual<string>("Turkey", model.CountryName); 

    } 

} 

這對我的需求很好,但是想知道我是否正在按照本書進行操作。還有其他的模式,我真的應該在這裏。我不想僞造我的數據,這裏真正激烈的是測試我的DAL和真實的生產數據。

回答

2

如果其他人(或者甚至你)進入你的數據庫並創建一個新的批准國家或更改你的國家名稱,你的測試將失敗。你會想:「我的存儲庫WTH是錯誤的,爲什麼它沒有按預期工作?」但是,這個問題不在版本庫中。

當我編寫測試命中數據庫時,我喜歡在啓動時創建數據庫並加載默認值,然後在該數據庫之後立即進行銷燬。我不確定這是否是最好的選擇,但它工作得很好。這種方法存在的問題是速度較慢,代碼更多。

+0

是的,你是對的,如果別人會去餐桌並將土耳其國家名稱更改爲別的東西,它會中斷。但我這裏激烈的是測試我的EF代碼是否正常工作。所以,你建議將所有的值加載到變量中,然後再使用它們?它會帶來什麼樣的差異? – tugberk

+0

不是變量。我在啓動時運行SQL來創建數據庫和數據。之後,我的測試運行,它會檢查知識庫是否返回預期值。我確信數據將在那裏,並且我知道該如何預期,因爲我已經寫了SQL(即在測試代碼中)。不同之處在於你不太依賴數據庫的當前狀態。如果某些測試更改了某一行的狀態,則需要將其回滾,因爲下次運行它時,測試可能會失敗。 – goenning

+0

好吧。所以製作數據庫的副本並在本地運行它也可以使用假數據,對吧? – tugberk

0

針對手頭的需求,即真正靜態的數據,不應該被篡改,我會說這是一個有效的方法。

然而,我會推薦寫data-driven tests,而不是每個國家都重複相同的測試用例。

0

您應該只使用靜態數據庫進行測試,而您的方法測試GetAll應該與實際預期計數相比較。你如何知道它確實返回了你所期望的,如果你只是斷言它返回了至少一條記錄?你甚至應該通過結果集並測試所有記錄是否滿足條件(但它通常用於更復雜的條件)。