2009-02-12 58 views
6

我認爲總是返回空列表或數組而不是空 當一個方法沒有結果以避免代碼中的空檢查時,這是一個好習慣。將空列表作爲默認Rhino Mocks

因爲Rhino Mocks返回一個對象的默認值(對於列表和數組而言),所以很多時候我必須添加null check或者設置mocks返回列表的期望值。

有沒有辦法用這種行爲配置或擴展Rhino Mocks?

var repositoryMock = MockRepository.GenerateMock<ICustomerRepository>(); 
IList<Customer> customers = repositoryMock.getCustomers(); 

Assert.IsNotNull(customers); 
Assert.AreEqual(0, customers.Count); 

回答

0

原來,只要返回的對象是IEnumerable,此行爲對於Moq是可能的。以下測試通過:

[Test] 
public void EmptylListTest() 
{ 
    var repositoryMock = new Mock<ICustomerRepository>(); 

    IEnumerable<Customer> customers = repositoryMock.Object.GetCustomers(); 

    Assert.IsNotNull(customers); 
    Assert.AreEqual(0, customers.Count()); 
} 

[Test] 
public void EmptyArrayTest() 
{ 
    var repositoryMock = new Mock<ICustomerRepository>(); 

    Customer[] customerArray = repositoryMock.Object.GetCustomerArray(); 

    Assert.IsNotNull(customerArray); 
    Assert.AreEqual(0, customerArray.Length); 
} 

public interface ICustomerRepository 
{ 
    IEnumerable<Customer> GetCustomers(); 
    Customer[] GetCustomerArray(); 
} 
0

Rhino Mocks沒有任何功能可以自動解決您的問題。最簡單的解決方案是簡單地爲每個使用SetupResult(或repeat.any)配置默認值的類型設置擴展/實用程序方法。

你可能總是很棘手,並通過成員枚舉,檢查ILists/Arrays並動態設置模擬 - 它取決於你有多少種類型,你可以爲這種實用方法貢獻多少類型。

祝你好運!

-1

我認爲改變模擬的默認行爲返回非默認值將是一個冒險的舉動。

如果你真正的ICustomerRepository實現有一個錯誤,那麼它不會返回一個空列表而是返回一個null,會發生什麼?

如果您編寫了其他單元測試並針對自動返回空列表的ICustomerRepository的模擬版本進行測試,那麼您會認爲一切正常。你甚至可能建立這個代碼並認爲它​​能正常工作,所以你運行你編譯的應用程序並開始崩潰。

爲什麼?因爲碰到ICustomerRepository的類沒有正確處理空值。

我更願意明確表示,並且在測試中設置一個期望,以從getCustomers()方法返回一個空白的IList,而不是在模擬內發生「魔術」。爲什麼?因爲它提高了可讀性,並且代碼根據其他可能不像Rhino那麼親切的開發人員所期望的那樣工作。即沒有預期的方法返回默認值。

+1

這是一個正確的觀點是,如果ICustomerRepository返回null應用程序會崩潰,但是這與資源庫,不使用它的類的錯誤。我會(希望:))有倉庫的單元測試來解決這個問題。 – Dala 2009-02-13 10:53:42