2009-08-17 63 views
9

我通過方法鏈創建了一些小流利的接口。他們通常會調用一些從Web服務/數據庫獲取數據的存儲庫。如何對使用Fluent界面的代碼進行單元測試?

我應該如何去使用流利接口的單元測試方法?

Public IEnumberable<Computer> FindComputers(string serialNumber) 
{ 
     return Computers.FindBySerialNumber("YBCX00900") 
     .AttachConfiguration() 
     .EnsureAllComputersHaveConfiguration(); 
} 

我可以單元測試流暢界面的各個組成部分,但如果我想單元測試上面我應該怎麼做FindComputers方法?

  1. 使用具體實現流暢的界面,並且寫上庫類
  2. 模擬流利的接口本身 期望和設置該
  3. 測試只有一口流利的接口本身的預期,而不是FindComputers ()方法

我想找到一個易於維護的方法。

回答

3

我認爲金融衍生工具做得比需要的多。我假設你使用計算機作爲數據映射器,並將其用於構建查詢。從你出什麼查詢從此建立起來:

rule 1: find configured computer with serial number = "whatever" and has-config = true. 
rule 2: find not-config computer with serial number = "whatever and has-config = true. 
rule 3: find configured computer with serial number = "whatever" and has-config = false. 
rule 4: find not-config computer with serial number = "whatever" and has-config = false. 
rule 5: find all computer with serial number = "whatever" and has-config = true. 
rule 6: find all computer with serial number = "whatever" and has-config = false. 

等等...

現在其中的一些規則,可以實現似乎是不正確的。規則2和規則3似乎是交叉的目的。規則5和規則6做什麼?這是對的嗎?

因爲你已經實現了一個打破SRP的對象。第一步是從數據映射器中分解查詢生成器。建立您的FI查詢對象,然後將其傳遞給映射器。

現在您可以測試FindComputers確保FI查詢對象被髮送到數據映射器。因爲你現在可以建立一個FI查詢對象,所以你可以測試它。您可以測試數據映射器使用查詢對象。

如果將來想要按位置查找計算機,該怎麼辦?如果你保留與你寫的相同的代碼,你將不得不添加一個方法FindByLocation並且在你知道它之前你有一個上帝對象。臭!

+0

謝謝,你是對的,這個例子很糟糕,我已經把FI分解成一個用於查詢,另一個用於對返回的數據執行操作。 我發現最簡單的方法是單元測試FI,然後使用FI和具體實現的單元測試方法。只是測試,返回所需的結果。 試圖模擬FI只會使測試過於脆弱。 – Andronicus 2009-08-19 22:15:37

0

我會做2 + 3。假設流暢的接口是真正的接口,它們應該相對簡單地模擬。只要意識到調用鏈中的每一步都應該返回一個新的模擬對象,這又會期待鏈中的下一個調用。

您仍然應該直接測試流暢接口,嘲笑它們下方的存儲庫層。

+0

感謝您的輸入, 我想到了嘲諷流暢的界面本身,但它只是似乎很奇怪,寫測試,如... 期待(X => x.FindBySerialNumber(空))。返回(nextMock) 期望(x => x.AttachConfiguration())。返回(nextMock) 當它測試的全部內容是調用實際進行時。在模擬對象中重新創建整個流暢接口是很多工作,只是爲了測試已經清楚寫在被測方法中的內容。 – Andronicus 2009-08-17 22:42:42

+0

我是新來做單元測試的,並且有時會遇到同樣的問題。雖然易於通過檢查來檢查代碼,但這仍然是人工審查。當你不再考慮這門課的時候,增加測試範圍有助於保護你。這也可能表明流暢的界面比需要的更復雜 - 如果界面更關注於你所需要的測試,寫起來也會更簡單。 – 2009-08-17 23:10:21

1

你能嘲笑你的倉庫嗎?雖然有些人會主張採用更純粹的方法,您必須隔離一個類的一種方法,但這將是測試FindComputers和流暢接口如何協同工作的體面方式。這可能更簡單,取決於Repository訪問層的外觀。

相關問題