2011-09-07 108 views
4

在TDD中,我一直在通過嘲笑數據訪問功能來測試業務邏輯。 ,但實際上我需要業務層下面的層也要實現應用程序工作。TDD數據訪問層

我應該使用TDD來實現數據訪問層嗎?
根據我在網上看到的討論,單元測試不應該連接到任何外部資源,如數據庫,Web服務等。如果它們連接,那麼它們將成爲集成測試。

請問有人可以對此有所瞭解。

非常感謝。

回答

2

你是對的,接觸到外面使得集成測試,但接觸是重要的測試也是如此。使用TDD時,它應該暴露給你,接觸面儘可能小。這可以通過爲每個記錄使用包裝或類似的方法來實現。

0

您可以使用開發魔術假來假的DAL,因此您可以根據您的需要,而無需編寫任何代碼,例如

假DAL

只需添加一個參考DevMagicFake.dll與TDD的工作,你可以在代碼以下:

[HttpPost] 
public ActionResult Create(VendorForm vendorForm) 
{ 
    var repoistory = new FakeRepository<VendorForm>(); 
    repoistory.Save(vendorForm); 
    return View("Page", repoistory.GetAll()); 
} 

這將節省VendorForm常駐在內存中,並且可以隨時獲取它,你需要,你還可以生成此對象或模型中的任何其他對象的數據,而無需編寫任何代碼到操作,所以現在您可以使用TDD,因爲您已經完成了DAL以瞭解有關Dev Magic Fake的更多信息,請參閱以下C odePlex:

http://devmagicfake.codeplex.com

感謝

M.Radwan

1

如果你使用類似Hibernate的東西,並且你的DAO中有任何類型的邏輯,你可以模擬出對例如會話和查詢和單元測試的調用,而不用敲擊數據庫。

如果你想測試自己的查詢,你可以使用內存數據庫和類似DbUnit的東西。我會把這些數據統計爲集成測試,並分別運行,因爲它們往往需要更長的時間。

下面是一個典型的Java春/ Hibernate的DAO方法有一些邏輯的一個例子,你可能想測試:

public List<Entity> searchEntities(final String searchText, final int maxResults) { 

    String sql = "select * from entity where field like :text"; 

    Query query = sessionFactory.getCurrentSession().createSQLQuery(sql); 

    if (maxResults != 0) { 
     query.setMaxResults(maxResults); 
    } 

    query.setString("searchText", "%"+searchText+"%"); 

    return query.list(); 

} 

用諷刺的框架,你可以模擬SessionFactory層,會話和查詢,並創建一個單元這個測試具有期望query.setMaxResults僅在它不等於0並且該query.setString被用正確的字符串值調用時才被調用。你也可以斷言,無論從query.list()返回的是該方法返回的東西。

但是,這使您測試代碼耦合到您的這種方法的實施。另外,如果你的DAO方法中有很多邏輯,那麼你應該考慮重構,並且可能將這個邏輯轉移到一個服務層,在那裏你可以單獨測試它與任何數據庫交互。