2016-04-20 19 views
0

正確枚舉如果我嘲笑的集合讓起訂量實施的GetEnumerator回撥不同集合的的GetEnumerator,我得到正確的結果,如果我調用的MoveNext /電流和foreach。結果視圖不VS調試

當我嘗試使用來自Visual Studio調試器的結果視圖時,我得到「枚舉沒有結果」。是否有一個原因?是不是隻是枚舉並緩存呢?

var dbParameterMock1 = CreateDbParameterMock("@Parameter1", 1); 

var dbParameters = new ArrayList { dbParameterMock1.Object }; 

var dbParameterCollectionMock = new Mock<DbParameterCollection>(); 

dbParameterCollectionMock.Setup(collection => collection.GetEnumerator()).Returns(dbParameters.GetEnumerator()); 

return dbParameterCollectionMock; 

回答

0

感謝@Patrick斯蒂爾誰幫我認識到我的錯誤:

的問題是在這裏:

[...].Returns(dbParameters.GetEnumerator()); 

這是越來越枚舉實例,並用它來模擬。一旦第一次使用,它可能會被處置,並設置爲空。

如上所述,結果視圖枚舉兩次,並顯示第二次結果爲null(並顯示問號,因爲處置枚舉器顯然有問題)。

爲了生存後續枚舉,它需要使用模擬拉姆達每次查詢一個新問題:

[...].Returns(() => dbParameters.GetEnumerator()); 
1

這肯定與調試器與對象交互的方式有關。我重新創建你的例子在一個控制檯應用程序,但每次GetEnumerator被稱爲添加的回調,所以我會知道:

var dbParameterMock1 = new Mock<DbParameter>().SetupAllProperties(); 
dbParameterMock1.Object.ParameterName = "@Parameter1"; 
dbParameterMock1.Object.Value = 1; 

var dbParameters = new ArrayList { dbParameterMock1.Object }; 
var dbParameterCollectionMock = new Mock<DbParameterCollection>(); 
dbParameterCollectionMock.Setup(collection => collection.GetEnumerator()) 
    .Returns(dbParameters.GetEnumerator()) 
    .Callback(() => Console.WriteLine("GetEnumeratorCalled")); 

foreach (DbParameter p in dbParameterCollectionMock.Object) 
{ 
    Console.WriteLine(p.ParameterName); 
} 

如果我設置一個斷點上的foreach,運行代碼,然後使用調試器來查看dbParameterCollectionMock.Object ,我會看到GetEnumerator()被調用兩次。第一個將返回ArrayList的實際枚舉器,而後續調用將返回null。看來調試器正在枚舉第二個調用,因此「Enumeration沒有結果」消息。

因此,在上述調試器已經調用GetEnumerator的一個模擬調用的情況下,如果我繼續運行該應用程序,則該foreach將不做任何事情而完成。再一次,因爲調試器已經調用了一個,嘲笑,GetEnumerator

不是一個真正的「答案」,但可能有助於闡明你所看到的東西。

+0

謝謝你的努力;任何想法爲什麼它第二次返回null? GetEnumerator應該每次都返回一個新的枚舉器......除非......我是多麼愚蠢!當我打字時,我意識到它正在使用先前的值,而不是再次調用GetEnumerator()。我應該試試lambda。 (然而好奇的是沒有處置的例外而是空的......) –