IDbAsyncEnumerable nicht implementiert

11

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

    
kevingoos 10.10.2014, 09:25
quelle

5 Antworten

23

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. ...

    
Hans Passant 12.10.2014, 21:42
quelle
4

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.

    
Jodee Dex Page 06.06.2016 22:23
quelle
3

Um mein IDbAsyncEnumerable Problem zu lösen:

  1. Das Ziel meines Projekts wurde von .NetFramework 4.0 in .NetFramework 4.5

  2. geändert
  3. Neu installiert EntityFramework 6.1.3 Nuget-Paket .

  4. An dieser Stelle hat mir der Visual Studio-IDE Zeige potenzielle Fixes Advisor ermöglicht, auf den System.Data.Entity.Infrastructure-Namespace

  5. zu verweisen
  

mit System.Data.Entity.Infrastructure ;

    
Julio Nobre 27.10.2016 22:46
quelle
2

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.

%Vor%     
Tony O'Hagan 29.06.2017 02:16
quelle
1

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.

    
usr 10.10.2014 09:36
quelle

Tags und Links