Ich versuche, einen FakeDbContext mit einem FakeDbSet für Unit-Tests zu erstellen.
Aber ich bekomme den folgenden Fehler (siehe unten). Ich erweitere DbSet so normal, dass IDbAsyncEnumerable implementiert werden sollte. Und wenn ich es implementiere, sagt es, dass es keinen Nutzen hat.
Ausnahme:
System.InvalidOperationException: Die Quelle, die IQueryable nicht hat implementieren IDbAsyncEnumerable. Nur Quellen, die IDbAsyncEnumerable implementieren, können für Entität verwendet werden Asynchrone Framework-Vorgänge Für weitere Details siehe Ссылка .
FakeDbSet-Klasse:
%Vor%Hier ist ein Sinn mit dem Code. In der letzten Datei im Geiste tritt der Fehler auf. Gist-Code
Ihr Szenario wird explizit in dem Link erwähnt, der mit der Ausnahmebedingungsnachricht ( Ссылка ) bereitgestellt wird. Die fehlende Zutat ist der IDbAsyncQueryProvider, den Sie von Ihrer Provider-Eigenschaft zurückgeben sollten.
Navigieren Sie einfach durch den Link, um zu der Standard-Implementierung zu gelangen.
Wenig kann ich hinzufügen, ich zitiere nur den wesentlichen Satz:
Um asynchrone Abfragen verwenden zu können, müssen wir etwas mehr arbeiten. Wenn wir versuchen würden, unser Moq DbSet mit der GetAllBlogsAsync-Methode zu verwenden, erhalten wir die folgende Ausnahme:
System.InvalidOperationException: Die Quelle IQueryable implementiert IDbAsyncEnumerable nicht. Nur Quellen, die IDbAsyncEnumerable implementieren, können für asynchrone Entity Framework-Vorgänge verwendet werden. Weitere Informationen finden Sie unter Ссылка .
Um die asynchronen Methoden zu verwenden, müssen wir einen dbAsyncQueryProvider im Speicher erstellen, um die asynchrone Abfrage zu verarbeiten. Während es möglich wäre, einen Abfrageanbieter unter Verwendung von Moq einzurichten, ist es viel einfacher, eine Testdoppelimplementierung in Code zu erstellen. Der Code für diese Implementierung lautet wie folgt:
usw. ...
Nur ein Hinweis für Benutzer, die den oben beschriebenen Standardcode von Microsoft verwenden. Hier ist eine schnelle Hilfsklasse, die Ihre gespiegelten Daten in asynchrone Ergebnisse umwandeln kann. Einfach an den unteren Rand des MS-Codes hinzufügen und mit etwas wie
aufrufen %Vor%.......
%Vor%Es ist der gleiche Code wie im MS-Beispiel, aber generisch und wiederverwendbar aus vielen verschiedenen Komponententests.
Um mein IDbAsyncEnumerable Problem zu lösen:
Das Ziel meines Projekts wurde von .NetFramework 4.0 in .NetFramework 4.5
Neu installiert EntityFramework 6.1.3 Nuget-Paket .
An dieser Stelle hat mir der Visual Studio-IDE Zeige potenzielle Fixes Advisor ermöglicht, auf den System.Data.Entity.Infrastructure-Namespace
mit System.Data.Entity.Infrastructure ;
Ich habe die Beispieltestklassen von hier umbenannt, um das Wort Test
zu entfernen, seit sie es sind sind außerhalb des Tests nützlich:
DbAsyncEnumerable
DbAsyncEnumerator<T>
DbAsyncQueryProvider<TEntity>
Dann habe ich die unten stehende Erweiterungsklasse hinzugefügt, so dass Sie es jetzt einfach tun können ...
%Vor% Dies ist nicht nur in Komponententests nützlich, sondern auch wenn Sie eine IQueryable<T>
-Schnittstelle implementieren möchten, die entweder eine asynchrone Datenbankabfrage oder Speicherdaten zurückgibt, die Sie später sicher als query.ToAsyncArray()
aufrufen können.
DbSet
implementiert wahrscheinlich IDbSet
implizit, so dass diese Methoden nicht für Interface-Mapping in Ihrer abgeleiteten Klasse.
Nicht von IDbSet<TEntity>
ableiten.
Sie können das nicht explizit aufrufen implementierte Interface-Mitglieder von IDbSet
aus einer Neuimplementierung dieser Schnittstelle.
Tags und Links c# entity-framework