Sto provando a scrivere i miei duplicati di test per il testing simulato di Entity Framework core seguendo questo tutorial per EF 6:
https://docs.microsoft.com/en-us/ef/ef6/fundamentals/testing/writing-test-doubles
Il tutorial viene bloccato sulla classe TestDbSet, che dovrebbe fornire un'implementazione in-memory di DbSet. Tuttavia, la maggior parte dei membri non è compatibile con EF Core:
public class TestDbSet<TEntity> : DbSet<TEntity>, IQueryable, IEnumerable<TEntity>, IDbAsyncEnumerable<TEntity>
where TEntity : class
{
ObservableCollection<TEntity> _data;
IQueryable _query;
public TestDbSet()
{
_data = new ObservableCollection<TEntity>();
_query = _data.AsQueryable();
}
public override TEntity Add(TEntity item)
{
_data.Add(item);
return item;
}
public override TEntity Remove(TEntity item)
{
_data.Remove(item);
return item;
}
public override TEntity Attach(TEntity item)
{
_data.Add(item);
return item;
}
public override TEntity Create()
{
return Activator.CreateInstance<TEntity>();
}
public override TDerivedEntity Create<TDerivedEntity>()
{
return Activator.CreateInstance<TDerivedEntity>();
}
public override ObservableCollection<TEntity> Local
{
get { return _data; }
}
Type IQueryable.ElementType
{
get { return _query.ElementType; }
}
Expression IQueryable.Expression
{
get { return _query.Expression; }
}
IQueryProvider IQueryable.Provider
{
get { return new TestDbAsyncQueryProvider<TEntity>(_query.Provider); }
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return _data.GetEnumerator();
}
IEnumerator<TEntity> IEnumerable<TEntity>.GetEnumerator()
{
return _data.GetEnumerator();
}
IDbAsyncEnumerator<TEntity> IDbAsyncEnumerable<TEntity>.GetAsyncEnumerator()
{
return new TestDbAsyncEnumerator<TEntity>(_data.GetEnumerator());
}
}
L'errore che si verifica per i metodi Aggiungi, Allega, Rimuovi e Crea è lo stesso per tutti e quattro:
'TestDbSet <TEntity> .Add (TEntity)': il tipo restituito deve essere 'EntityEntry <TEntity>' per abbinare il membro sottoposto a override 'DbSet <TEntity> .Add (TEntity)
Qualcuno sarebbe in grado di spiegare se posso convertire <TEntity> in EntityEntry <TEntity> o se c'è un modo migliore per aggirare il problema? Grazie molto
@Edward la tua soluzione ha funzionato perfettamente, restituendo null il tutorial è ora compatibile con il core EF almeno per i miei test, grazie per il suggerimento.
alcune modifiche in TestContext: - utilizzando Microsoft.EntityFrameworkCore.Query.Internal; - utilizzando Microsoft.EntityFrameworkCore.ChangeTracking; - cambia IDbAsyncEnumaerable e IDbAsyncEnumerator in IAsyncEnumerable e IAsyncEnumerator - aggiungi, rimuovi e collega metodi: cambia il tipo di ritorno da TEntity a EntityEntry e cambia l'ultima istruzione in ciascun metodo per restituire null; - alcuni altri metodi mostreranno l'errore di compilazione, basta eliminarli.