.Net Core에서 DbContext
에 대해 실행되는 단위 테스트를 작성하려고합니다. 나는 전체 프레임 워크 EF와 모든 작업에서 같은 것을 수행했다.단위 테스트 모조품 DbContext DbSet <>이 null입니다.
아래 코드는 문제를 재현 할 수있는 최소 코드를 나타냅니다. 나는 다음과 같은 모의 객체
// 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));
}
내가
시도하고있어 한 를 구현되지 않은 아무것도를 제거했다 여기에 포함되지 않은 일부 서비스 코드를 테스트 할 수 있습니다. 문제는 f를 호출하여 다시 만들 수 있습니다. 테스트 방법에서 ollowing.MockUnitOfWork unitOfWork = new MockUnitOfWork();
var x = unitOfWork.StateRepository.GetAllAsync().Result;
우리는 또한 거의 테스트 비동기 섹션에서 Entity Framework Testing with a Mocking Framework 찾을 수 있습니다 무엇을 구현하는 확장이있다. 또한이 결과는 null이됩니다. DbSet<>
제가 누락 된 것일 수 있습니다.
감사합니다. 그것은 완벽하고 조롱 거리를 많이 벗어 버릴 수있게 해줍니다. – Darren