C# 单元测试模拟DbContext数据库集<&燃气轮机;是空的

C# 单元测试模拟DbContext数据库集<&燃气轮机;是空的,c#,entity-framework,unit-testing,moq,C#,Entity Framework,Unit Testing,Moq,正在尝试在.NETCore中编写针对DbContext运行的单元测试。我已经在完整的框架EF和所有工作中执行了相同的操作 下面的代码表示重新创建问题的最低代码。我已经去掉了任何没有实现的东西 我有以下模拟 // DbContext public class MockDbContext : DbContext { public virtual DbSet<State> State { get; set; } } 我们还有一个扩展,它实现了在testing async部分中可以

正在尝试在.NETCore中编写针对
DbContext
运行的单元测试。我已经在完整的框架EF和所有工作中执行了相同的操作

下面的代码表示重新创建问题的最低代码。我已经去掉了任何没有实现的东西

我有以下模拟

// DbContext
public class MockDbContext : DbContext
{
    public virtual DbSet<State> State { get; set; }
}
我们还有一个扩展,它实现了在testing async部分中可以找到的功能。这也会导致
DbSet


知道我可能缺少什么吗?

当使用Entity Framework Core时,
Microsoft.EntityFrameworkCore.InMemory
NuGet包提供了测试场景所需的基础结构。然后,您的存储库可以使用适当的
DbContext
,您的工作单元可以接受适当的存储库


有关在EF Core中使用InMemory provider进行测试的更多详细信息,请访问。

谢谢。这是完美的,让我摆脱了很多嘲笑。
// Mock of my repository
public class MockRepository<TModel> : IRepository<TModel> where TModel : class
{
    MockDbContext _context;
    DbSet<TModel> _dbSet;

    public MockRepository(MockDbContext context)
    {
        _context = context;
        // THIS IS NULL
        _dbSet = _context.Set<TModel>();
    }

    public async Task<IList<TModel>> GetAllAsync()
    {
        return _dbSet.ToListAsync().Result;
    }

    public void Add(TModel t)
    {
        _context.Add(t);
    }
}
// Unit of work
public class MockUnitOfWork : IUnitOfWork
{
    private Mock<MockDbContext> _mockDbContext;
    private IRepository<State> _stateRepo;

    public MockUnitOfWork()
    {
        var mockState = new List<State>() { new State { StateId = 1, Name = "Added" }, new State { StateId = 1, Name = "Deleted" } }.AsQueryable();

        var mockStateSet = new Mock<DbSet<State>>();
        mockStateSet.As<IQueryable<State>>().Setup(m => m.Provider).Returns(mockState.Provider);
        mockStateSet.As<IQueryable<State>>().Setup(m => m.Expression).Returns(mockState.Expression);
        mockStateSet.As<IQueryable<State>>().Setup(m => m.ElementType).Returns(mockState.ElementType);
        mockStateSet.As<IQueryable<State>>().Setup(m => m.GetEnumerator()).Returns(mockState.GetEnumerator());


        _mockDbContext = new Mock<MockDbContext>();
        _mockDbContext.Setup(o => o.State).Returns(mockStateSet.Object);
    }       
    public void SaveAsync()
    {
        _mockDbContext.Object.SaveChanges();
    }

    public IRepository<State> StateRepository => _stateRepo ?? (_stateRepo = new MockRepository<State>(_mockDbContext.Object));
}
MockUnitOfWork unitOfWork = new MockUnitOfWork();
var x = unitOfWork.StateRepository.GetAllAsync().Result;