.net核心测试dbsets

时间:2017-03-30 12:17:37

标签: c# asp.net-core xunit.net

我正在准备我的测试基础架构,但是我的测试存储库遇到了一些问题。

真正的存储库访问EntityFramework DbSet,如下所示:

public class Repository<T>: IRepository<T> where T : ModelBase
{
    protected ApplicationDbContext db;
    private DbSet<T> dbSet;
    public Repository(ApplicationDbContext db)
    {
        this.db = db;
        dbSet = db.Set<T>();
    }

    public IQueryable<T> Where(Expression<Func<T, bool>> predicate)
    {
        return dbSet.Where(predicate).AsNoTracking();
    }

    ....

我的TestRepository使用List而不是DbSets:

public class TestRepository<T> : IRepository<T> where T : ModelBase
{
    private readonly List<T> dbSet;
    protected ApplicationDbContextFake db;        

    public TestRepository(ApplicationDbContextFake db)
    {
        this.db = db;
        this.dbSet = db.Set<T>();
    }

db.Set<T>()返回一个列表

测试我的代码时会出现问题,有类似的内容:

public async Task DeleteAsync()
{
    var items = repository.Where(....);
    repository.RemoveRange(await items.ToListAsync());

此代码使用Entity DbSets运行正常,但在使用我的TestRepository进行测试时会抛出异常:

  

源IQueryable未实现IAsyncEnumerable。只有实现IAsyncEnumerable的源才能用于Entity Framework异步操作。

有任何建议可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

如果您使用的是EntityFramework Core(不是EF6) - 您可以在测试中使用内存实现。

查看Microsoft.EntityFrameworkCore.InMemory提供商的文档。