我正在使用.NET Core 2.0和.NET Core MongoDB驅動程序。使用IMongoQueryable進行單元測試
我已經創建了一個信息庫,像這樣:
public interface IRepository<T>
{
IMongoQueryable<T> Get()
}
我這樣做給靈活性,誰使用這是能夠做到的LINQ就像他們會做使用EF。問題是當涉及到單元測試時,我正嘗試創建一個內存數據庫,以便在操作之前和之後檢查狀態。
一些東西,我想:
public class InMemoryRepository : IRepository<ConcreteType>
{
private HashSet<ConcreteType> _data = new HashSet<ConcreteType>();
public IMongoQueryable<ConcreteType> Get()
{
return (IMongoQueryable<ConcreteType>)_data.AsQueryable();
}
}
的情況下不作爲接口連續工作IMongoQueryable
是:
public interface IMongoQueryable<T> : IMongoQueryable, IQueryable, IEnumerable, IQueryable<T>, IEnumerable<T>, IAsyncCursorSource<T>
別的去了:
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;
}
}
這不工作爲IMongoQueryable.AsQueryable()
是一種擴展方法,我不能嘲笑/設置。
嘲諷的IQueryable接口是很困難的和危險的,因爲你不能正確地模仿執行的行爲。因此,您的可能通過,但它不會對實際的MongoDb實例工作。資源庫的作用是將數據訪問技術從應用程序的業務邏輯中抽象出來。如果您的資源庫向您的業務層公開了MongoDb特定的接口,那麼您有一個漏洞抽象。您冒着將您的業務邏輯與特定的數據訪問技術聯繫起來的風險。 –