So verwenden Sie Moq mit Entity Framework IDbSet Count () usw. Methoden

8

Ich versuche Moq zu verwenden, um einige Tests für Entity Framework Code First-Klassen durchzuführen. Ich bin sehr neu in Moq und spöttische Techniken und ich frage mich, ob es leicht ist, einen Test zu machen, den ich unten beschreiben werde. Ich suchte im Internet nach Lösungen, aber die meisten basieren auf Repository-Mustern, die ich vermeiden möchte.

Ich habe ITestEntities interface für den Kontext

%Vor%

Dann Kontext

%Vor%

Ein Controller und eine Aktion zum Testen

%Vor%

Und schließlich ein NUnit-Test mit Moq

%Vor%

Das Problem ist mit dieser Zeile: mockUsers.Setup(m => m.Count()).Returns(2); . Beim Ausführen dieses Tests bekomme ich folgenden Fehler:

System.NotSupportedException : Expression references a method that does not belong to the mocked object: m => m.Count<User>()

Ich denke, das liegt daran, dass .Count() eine statische Methode ist und daher nicht von Moq gespottet werden kann. Gibt es eine Möglichkeit, diese einfache Aktion mit Moq zu testen und nicht vollwertige Repository-Muster zu verwenden, die, wie ich es verstehe, dieses .Count() part in eine Methode überprüfbar machen sollten ... Vielleicht benutze ich einfach die Mocks in einem Falsche Weg? Denn ich habe den Eindruck, dass dies mit EF Code First ganz einfach und möglich sein sollte.

    
Episodex 25.04.2013, 08:50
quelle

2 Antworten

14

Wenn Sie sich über die Test-Entitäten lustig machen, müssen Sie sich in der Kette nicht weiter verspotten

Etwas wie das sollte tun (obwohl ich nicht in einer IDE bin, so dass einige Feinabstimmungen brauchen)

Aktualisieren, um neues InMemoryDbSet

aufzunehmen %Vor%

Dies bedeutet, dass die Erweiterungsmethoden einfach von den Testdaten ausgehen, die Sie bereitgestellt haben.

Siehe unten für einen guten Artikel über das Mocking von dbset Ссылка

    
NinjaNye 25.04.2013, 12:32
quelle
1

Mock GetEnumerator() anstelle von Count()

Count() ist eine Erweiterungsmethode für Objekte, die IEnumerable<T> implementieren, und IDbSet<T> implementiert IEnumerable<T>

Erweiterungsmethoden werden an das Objekt übergeben, an dem sie aufgerufen werden. In diesem Fall lautet die Signatur:

%Vor%

Anstatt zu versuchen, Count() so einzurichten, dass ein bestimmter Wert zurückgegeben wird, können Sie die Mitglieder von IEnumerable<T> einrichten, um dasselbe Ergebnis zu erzielen. Im Falle von IEnumerable<T> müssen Sie nur GetEnumerator() einrichten, um ein Enumerator<T> zurückzugeben, das über zwei Werte aufzählt.

In dieser Situation erstelle ich normalerweise Enumerator<T> , indem ich eine neue Liste mit ein paar Elementen erstelle und GetEnumerator() darauf anrufe:

%Vor%

Nun wird natürlich die Erweiterungsmethode Count() zusätzlich zu dem, was Sie mit Ihrem Test erreichen wollen, effektiv getestet, während dies ein ziemlich geringes Risiko darstellt, wenn die Erweiterungsmethode Teil von .NET ist zu beachten, wenn Sie eigene Erweiterungsmethoden verwenden und erstellen.

    
Gene C 25.04.2013 13:30
quelle