2016-04-20 6 views
0

Wenn ich eine Sammlung lassen Moq verspotten die GetEnumerator implementieren die GetEnumerator einer anderen Sammlung zurückrufen, ich die richtigen Ergebnisse, wenn ich Movenext/Strom und foreach aufrufen.Ergebnis Ansicht nicht korrekt in VS-Debugger Aufzählen

Wenn ich versuche, die Ergebnisansicht aus dem Visual Studio-Debugger zu verwenden, bekomme ich "Enumeration ergab keine Ergebnisse". Gibt es einen Grund dafür? Ist es nicht nur das Aufzählen und Zwischenspeichern?

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; 

Antwort

0

Dank @Patrick Steele, den ich meinen Fehler erkennen geholfen:

Das Problem ist hier:

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

, die die Aufzählungs Instanz und deren Verwendung für die Mock erhalten. Einmal beim ersten Mal verwendet, wird es wahrscheinlich entsorgt und irgendwie auf null gesetzt.

Wie vorgeschlagen, zählt die Ergebnisansicht zweimal und präsentiert Ergebnisse vom zweiten Mal, die null sind (und ein Fragezeichen, da offensichtlich etwas mit dem angeordneten Enumerator nicht stimmt).

nachfolgende Aufzählungen Um zu überleben, braucht es für einen neuen ein Lambda für die Mock jedes Mal abfragen mit:

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

Es hat definitiv etwas damit zu tun, wie der Debugger mit dem Objekt interagiert. Ich neu erstellt Ihr Beispiel in einer Konsolenanwendung aber einen Rückruf so würde ich jedes Mal GetEnumerator heißt wissen hinzugefügt:

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); 
} 

Wenn ich einen Haltepunkt auf der foreach gesetzt, den Code ausführen und dann den Debugger verwenden, um die dbParameterCollectionMock.Object anzuzeigen Ich werde sehen, GetEnumerator() wird zweimal aufgerufen. Die erste würde Ihren tatsächlichen Enumerator der ArrayList zurückgeben, während nachfolgende Aufrufe null zurückliefern würden. Es scheint, als ob der Debugger den zweiten Aufruf aufzählt, daher die Meldung "Enumeration ergab keine Ergebnisse".

Folglich, in dem Fall oben, wo der Debugger bereits den einen mocked Anruf von GetEnumerator aufgerufen hat, wenn ich die App weiter ausführen, beendet die Foreach ohne etwas zu tun. Wiederum, weil der Debugger bereits den einen, mocked, GetEnumerator aufgerufen hat.

Keine echte "Antwort", aber kann helfen, etwas Licht auf das zu bekommen, was Sie sehen.

+0

Dank für die Mühe dankt; eine Idee, warum es das zweite Mal null zurückgibt? GetEnumerator soll jedes Mal einen neuen Enumerator zurückgeben ... außer ... Wie dumm ich bin! Während ich tippte, erkannte ich, dass es den vorherigen Wert verwendet, anstatt GetEnumerator() erneut aufzurufen. Ich sollte es mit einem Lambda versuchen. (Ist aber neugierig, das ist null statt einer entsorgten Ausnahme ...) –

Verwandte Themen