【发布时间】:2014-03-27 23:44:37
【问题描述】:
请有人告诉我如何正确模拟这个存储库类。基本上我只想模拟它,以便我可以轻松地测试我的服务层。 Am moq 在我的测试项目中使用 c# moq。最有问题的地方是 Query、Filter、Include 和 OrderBy 方法中使用的虚拟接口模式。如何模拟它,以便它可以返回我注入到我的存储库模拟中的正确 RepositoryQuery。
下面显示的代码是我与数据库通信的数据库层的一部分,因此我想将其模拟出来,以便我可以轻松地测试我的服务层而无需担心外部依赖。
public sealed class RepositoryQuery<TEntity> : IRepositoryQuery<TEntity> where TEntity : BaseEntity
{
private readonly List<Expression<Func<TEntity, object>>> _includeProperties;
private readonly Repository<TEntity> _repository;
private readonly List<Expression<Func<TEntity, bool>>> _filters;
private Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> _orderByQuerable;
private int? _page;
private int? _pageSize;
public RepositoryQuery(Repository<TEntity> repository)
{
_repository = repository;
_includeProperties = new List<Expression<Func<TEntity, object>>>();
_filters = new List<Expression<Func<TEntity, bool>>>();
}
public RepositoryQuery<TEntity> Filter(Expression<Func<TEntity, bool>> filter)
{
_filters.Add(filter);
return this;
}
public RepositoryQuery<TEntity> OrderBy(Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy)
{
_orderByQuerable = orderBy;
return this;
}
public RepositoryQuery<TEntity> Include(Expression<Func<TEntity, object>> expression)
{
_includeProperties.Add(expression);
return this;
}
public IQueryable<TEntity> Get()
{
return _repository.Get(_filters, _orderByQuerable, _includeProperties, _page, _pageSize);
}
}
还有这个
public class Repository<TEntity> : IRepository<TEntity> where TEntity : BaseEntity
{
private readonly Guid _instanceId;
private readonly DbSet<TEntity> _dbSet;
private readonly IDbContext _context;
public Repository(IDbContext context)
{
_context = context;
_dbSet = context.Set<TEntity>();
_instanceId = Guid.NewGuid();
}
public virtual IRepositoryQuery<TEntity> Query()
{
var repositoryGetFluentHelper = new RepositoryQuery<TEntity>(this);
return repositoryGetFluentHelper;
}
internal IQueryable<TEntity> Get(
List<Expression<Func<TEntity, bool>>> filters = null,
Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
List<Expression<Func<TEntity, object>>> includeProperties = null,
int? page = null,
int? pageSize = null)
{
IQueryable<TEntity> query = _dbSet;
if (includeProperties != null)
{
includeProperties.ForEach(i => query = query.Include(i));
}
if (filters != null && filters.Any())
{
query = filters.Aggregate(query, (current, filter) => current.Where(filter));
}
query = orderBy != null ? orderBy(query) : query.OrderBy(a => a.Id);
if (page != null && pageSize != null)
{
query = query
.Skip((page.Value - 1)*pageSize.Value)
.Take(pageSize.Value);
}
return query;
}
}
【问题讨论】:
-
您模拟的内容完全取决于您当前正在运行的测试。我们无法为您提供帮助。这完全取决于您。查找基本的模拟教程,以了解人们为每个测试模拟了什么。例如:您不会为了测试一个功能而模拟整个存储库。
-
嗨,上面的一些代码是我在数据层中使用的,因为它与数据存储通信,我想完全模拟它,这样我不仅可以测试一个函数,而且可以测试我的整个服务层。
标签: c# unit-testing moq