2015-05-14 85 views
8

我們是兩個學生寫我們的學士論文,我們開發了一個Windows應用程序,它應該能夠幫助餐廳進行各種溝通過程。從根本上說,它應該能夠呈現從客人發送給它的那一刻起的訂單信息。如何在NUnit中編寫集成測試?

我們在開發過程中忽略了測試,但現在決定編寫單元測試。不過,我們發現我們現在可以寫入系統的最適合的測試是集成測試,因爲我們類中的所有方法都通過LINQ to SQL綁定到SQL存儲過程。我們知道使用存根來僞造對數據庫的依賴關係,但是當我們的數據庫已經與所有函數一起實現時,我們認爲它會給我們提供更多的價值來將幾種方法作爲一個集成測試一起測試。

如下面的代碼所示,我們試圖按照單元測試的指導方針進行,但這是編寫集成測試的正確方法嗎?

[Test] 
public void SendTotalOrder_SendAllItemsToProducer_OneSentOrder() 
{ 
    //Arrange 
    Order order = new Order(); 
    Guest guest = new Guest(1, order); 
    Producer producer = new Producer("Thomas", "Guldborg", "Beverage producer");    
    DataGridView dataGridView = new DataGridView { BindingContext = new BindingContext() }; 
    order.MenuItemId = 1; 
    order.Quantity = 1; 

    //Act 
    guest.AddItem(); 
    dataGridView.DataSource = guest.SendOrderOverview(); 
    guest.SendOrder(dataGridView); 
    dataGridView.DataSource = producer.OrderOverview(); 
    var guestTableOrder = producer.OrderOverview() 
     .Where(orders => orders.gtid == guest.GuestTableId) 
     .Select(producerOrder => producerOrder.gtid) 
     .Single(); 

    //Assert 
    Assert.That(guestTableOrder, Is.EqualTo(guest.GuestTableId)); 
} 

回答

13

是的,一般來說,這是如何編寫單元測試/集成測試。你觀察一些重要準則:

  • 鮮明法案安排斷言步驟
  • 測試名稱描述了這些步驟(也許它應該有類似「ShouldSendOneOrder」末,「應該」常用來形容Assert)。
  • 一個斷言每個測試。

我想你也聽從其他準則:

  • 測試是獨立的:它們不改變持久化狀態,這樣他們就不會影響其他測試。
  • 測試現實用例:不要安排違反商業邏輯的星座,不要做不可能的行爲。或者:模仿真實的應用程序。

但是,我也看到引起眉毛的事情。

  • 目前尚不清楚其作用你測試。我認爲一些「行爲」屬於安排步驟。

  • producer.OrderOverview()這樣的方法讓我懷疑域對象執行數據庫交互。如果是這樣,這將違反持續性無知。我認爲應該有一個提供此方法的服務(但請參見下文)。

  • 不清楚爲什麼dataGridView.DataSource = producer.OrderOverview();是測試所必需的。如果是這樣,這隻會加劇最嚴重的問題:

  • 業務邏輯和用戶界面都糾結!

    • 法像guest.SendOrderOverview()producer.OrderOverview():爲什麼一個域對象知道如何目前它的內容?這是演示者(MVP)或控制器(MVC)或視圖模型(MVVM)應該負責的事情。
    • 類似guest.SendOrder(dataGridView)的方法是邪惡。它將領域層與UI框架聯繫起來。這個固定的依賴關係已經足夠邪惡了,但是當然你也需要這個方法中的網格視圖的值。所以業務邏輯需要熟悉一些UI組件。這違反了告訴 - 不要問原則。 guest.SendOrder應該有簡單的參數來告訴它如何完成它的任務,並且域不應該有任何參考任何 UI框架。

你真的應該解決後一點。使其成爲您的目標,無需與DGV進行任何交互即可運行此測試。

+0

非常感謝您的徹底解答!這是高度讚賞!我現在已經實現了你建議的大部分要點。實際上,這是我第一次進行集成測試,因此在做什麼和不該做什麼時獲得這種全面的解釋非常有價值:-) –

1

如果你繼續在類中綁定sql,你的測試不是一個大問題。

你可以使用這個方法的時候程序邏輯很簡單,但是我建議你學習The Repository Pattern,因爲邏輯變得更加複雜。

相關問題