J'utilise .NET Core 2.0 et le pilote .NET Core MongoDB.Tests unitaires avec IMongoQueryable
J'ai créé un dépôt comme ceci:
public interface IRepository<T>
{
IMongoQueryable<T> Get()
}
Je l'ai fait pour donner de la flexibilité à quiconque utilise pour pouvoir faire LINQ un peu comme ils le feraient en utilisant EF. Le problème est quand il s'agit de tests unitaires et j'essaie de créer une base de données en mémoire afin que je puisse vérifier les états avant et après l'opération.
Quelques trucs que j'ai essayé:
public class InMemoryRepository : IRepository<ConcreteType>
{
private HashSet<ConcreteType> _data = new HashSet<ConcreteType>();
public IMongoQueryable<ConcreteType> Get()
{
return (IMongoQueryable<ConcreteType>)_data.AsQueryable();
}
}
L'affaire ne fonctionne pas comme l'interface pour IMongoQueryable
est:
public interface IMongoQueryable<T> : IMongoQueryable, IQueryable, IEnumerable, IQueryable<T>, IEnumerable<T>, IAsyncCursorSource<T>
Un autre go:
public class InMemoryRepository : IRepository<ConcreteType>
{
private HashSet<ConcreteType> _data = new HashSet<ConcreteType>();
public InMemoryRepository()
{
_mongoQueryableMock = new Mock<IMongoQueryable<ConcreteType>>();
_mongoQueryableMock.Setup(m => m.AsQueryable()).Returns(_data.AsQueryable);
}
public IMongoQueryable<ConcreteType> Get()
{
return _mongoQueryableMock.Object;
}
}
Cela ne travailler comme IMongoQueryable.AsQueryable()
est une méthode d'extension et je ne peux pas mock/setup cela.
Il est toujours difficile et dangereux de se moquer de l'interface IQueryable, car vous ne pouvez pas imiter correctement le comportement de l'implémentation. Par conséquent, vous pourriez passer mais cela ne fonctionnera pas contre une véritable instance de MongoDb. Le rôle du référentiel est d'abstraire la technologie d'accès aux données de la logique métier de votre application. Si votre référentiel expose des interfaces spécifiques à MongoDb à votre couche de gestion, vous avez alors une abstraction qui fuit. Vous risquez de lier votre logique métier à une technologie d'accès aux données spécifique. –