2012-02-09 45 views
0

我有這需要一個IList<Person>並返回一個IEnumberable作爲這樣的方法:試圖創建起訂量對象

internal static IEnumerable<Dictionary<string, string>> GetPersonsPerSite(IList<Person> Data) 
    { 
     //Implementation ... 
    } 

,我試圖創造的IList<Person>模仿對象,所以我可以測試這種方法。

使用起訂量我寫了下面的:

var mockObjects = new Mock<IList<Person>>();

mockObjects.Setup(x => x[0]).Returns(new Person() 
               { 
                 SITE_ID = "test", 
                 MPAN = "test", 
                 ADDLINE1 = "test", 
                 ADDLINE2 = "test", 
                 ADDRESS_LINE_1 = "test", 
                 ADDRESS_LINE_2 = "test" 
               }); 

但是當我來到使用了IEnumerable返回的跳投引發異常的對象Object reference not set to an instance of an object.

我全新到Moq,我很肯定我在這裏錯過了一個基本的概念,但是我已經成功地能夠用其他模擬對象拋出異常和修改輸出。

我很感激,如果有人能指出我在正確的方向。

回答

5

不要嘲笑IList。你不需要,除非有特定的東西需要檢查。

而不只是保持你的測試簡單,做這樣的事情:

var testData = new List<Person>(){new Person() 
               { 
                 SITE_ID = "test", 
                 MPAN = "test", 
                 ADDLINE1 = "test", 
                 ADDLINE2 = "test", 
                 ADDRESS_LINE_1 = "test", 
                 ADDRESS_LINE_2 = "test" 
               }}; 
var result = GetPersonsePerSite(testData); 
+0

好吧,所以我明白我必須讓事情過於複雜 – 2012-02-09 09:22:26

+0

@ m.edmondson沒關係。將嘲笑應用到您看到的每個界面都很容易,並且忘記它只是爲了幫助您處理具有外部交互或難以設置的對象。 IList 是自包含的,易於實例化,所以你不妨使用真實的東西。 – 2012-02-09 09:32:14

+0

好的歡呼聲,有你的+1 – 2012-02-09 09:32:41

3

你在那裏得到的代碼看起來很好,對我來說確實有用。你可以通過一個例子來擴展你實際使用mockObjects.Object並找到它的地方嗎?

另外,你真的需要嘲笑你的IList<Person>? 如果您只是用它來爲測試中的方法提供測試數據,只需使用一個具體的列表 - 沒有什麼可以通過使用模擬來獲得。

當然,你可能正在嘲笑它,所以你可以驗證它採取了某些行動(方法稱爲,訪問的屬性等) - 在這種情況下,這是不同的。

+0

道歉,我的問題是錯誤的,我寫它的基礎上從昨天的內存,而不檢查。實際的問題是從該方法返回的IEnumberable導致異常「{」對象引用未設置爲對象的實例。「}'暗示我沒有在Moq聲明中設置任何內容。 – 2012-02-09 09:16:40

+0

你的意思是列表返回的枚舉? – 2012-02-09 09:27:34

+0

沒有'IEnumerable >' – 2012-02-09 09:28:26