2017-12-19 3 views
1

.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<>

제가 누락 된 것일 수 있습니다.

답변

0

엔티티 프레임 워크 코어를 사용하는 경우 Microsoft.EntityFrameworkCore.InMemory NuGet 패키지는 테스트 시나리오에 필요한 인프라를 제공합니다. 그런 다음 저장소에 적절한 DbContext을 사용하고 작업 단위 (UOW)에 적절한 저장소를 허용 할 수 있습니다.

EF 코어에서 InMemory 제공 업체를 테스트하는 방법에 대한 자세한 내용은 https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/in-memory에서 확인할 수 있습니다.

+0

감사합니다. 그것은 완벽하고 조롱 거리를 많이 벗어 버릴 수있게 해줍니다. – Darren

관련 문제