如何在.net Core中编写通用存储库模式的单元测试用例

问题描述

嗨,我正在尝试为通用存储库模式方法编写nunit测试用例。
下面是我在dbrepository中的方法

public class DbRepository<T> : BaseRepository,IDbRepository<T>
    where T : class
{
    private readonly DbContext _dbContext;
    private readonly DbSet<T> dbSet;

    public DbRepository(DbContext dbContext)
    {
        _dbContext = dbContext;
        dbSet = dbContext?.Set<T>();
    }
    public async Task<IEnumerable<T>> GetAsync(Expression<Func<T,bool>> filter = null,Func<IQueryable<T>,IOrderedQueryable<T>> orderBy = null,params Expression<Func<T,object>>[] includes)
    {
        IQueryable<T> query = this.dbSet;
        foreach (Expression<Func<T,object>> include in includes)
        {
            query = query.Include(include);
        }

        if (filter != null)
        {
            query = query.Where(filter);
        }

        if (orderBy != null)
        {
            query = orderBy(query);
        }

        return await query.ToListAsync().ConfigureAwait(false);
    }
}

然后我打算如下使用FakeDbSet。我在这里有点困惑。我在github https://github.com/tugberkugurlu/GenericRepository/blob/master/tests/GenericRepository.EntityFramework.Test/Infrastrucure/FakeDbSet.cs中找到了一个示例,这里有一些方法。在fakedbset中,我们是否需要在dbrepositry中编写完全相同的方法?下面是我的fakedbset类

public class FakeDbSet<T> : DbSet<T> where T : class
{
    ObservableCollection<T> _data;
    IQueryable _query;
    public FakeDbSet()
    {
        _data = new ObservableCollection<T>();
        _query = _data.AsQueryable();
    }
    public async Task<IEnumerable<T>> GetAsync(Expression<Func<T,object>>[] includes)
    {
        IQueryable<T> query = _query;
        foreach (Expression<Func<T,object>> include in includes)
        {
            query = query.Include(include);
        }

        if (filter != null)
        {
            query = query.Where(filter);
        }

        if (orderBy != null)
        {
            query = orderBy(query);
        }

        return await query.ToListAsync().ConfigureAwait(false);
    }
}

在上面的代码中,我添加了dbrepository中但在上面的方法代码中相同的方法GetAsync

IQueryable查询= _query;给出错误代码无法将类型system.linq.Iqueryable隐式转换为system.linq.Iqueryable。

然后我写了我的其中一份考试

[Test]
public void TestGetAsync()
{
    //Arrange
    var mock = new Mock<OrdersRequestContext>();
    mock.Setup(x => x.Set<OrdersRequestContext>())
        .Returns(new FakeDbSet<OrderDetails>
        {
            new OrderDetails{ OrderDetailsId = 6}
        });
    var entityRepository = new DbRepository<OrderDetails>(mock.Object);
    var orders = entityRepository.GetAsync();
}

由于上述错误,我无法运行此测试。我也想知道Fakedbset方法应该与我的dbrepository方法相同吗?我在IQueryable查询= _query中遇到错误;如我所说。因此,我正在以某种方式丢失某些东西,因此有人可以帮助我纠正这一点。任何帮助将不胜感激。谢谢

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)