尝试在.Net Core中编写针对DbContext
运行的单元测试。我在完整的框架EF中执行了相同的操作。
以下代码表示重新创建问题的最低代码。我已经删除了任何未实施的内容
我有以下嘲笑
// DbContext
public class MockDbContext : DbContext
{
public virtual DbSet<State> State { get; set; }
}
存储库
// 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;
我们还有一个扩展,可以在测试异步部分下实现几乎可以找到Entity Framework Testing with a Mocking Framework的内容。这也导致DbSet<>
知道我可能缺少什么吗?
答案 0 :(得分:1)
使用Entity Framework Core时,Microsoft.EntityFrameworkCore.InMemory
NuGet包提供测试方案所需的基础结构。然后,您的存储库可以使用适当的DbContext
,您的工作单元可以接受适当的存储库。
有关使用EF Core中的InMemory提供程序进行测试的其他详细信息,请访问https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/in-memory。