2014-12-10 3 views
0

조롱을 위해 DI와 MOQ에 MEF를 사용합니다.엔티티 프레임 워크 저장소 모방

Get()과 동일한 단위 테스트는 완벽하게 작동하지만 Get (2)는 절대적으로 작동하지 않습니다. MEF도 올바르게 초기화되고 MOQ됩니다. 나는 항상 null을 받는다. Get() 메서드에 인수가 있지만 인수가있는 것을 제외하면 완전히 동일한 코드입니다. GetEntities()는 abstract 클래스에서 GetEntity를 사용합니다.

참고로 데이터베이스를 방문했을 때 아무런 문제가 발생하지 않습니다.

public class TestClass 
{ 
    [Import] 
    IDataRepositoryFactory _DataRepositoryFactory; 

    public TestClass() 
    { 
     ObjectBase.Container.SatisfyImportsOnce(this); 
    } 

    public TestClass(IDataRepositoryFactory dataRepositoryFactory) 
    { 
     _DataRepositoryFactory = dataRepositoryFactory; 
    } 

    public IEnumerable<Customer> GetCustomers() 
    { 
     ICustomerRepository customerRepository = _DataRepositoryFactory.GetDataRepository<ICustomerRepository>(); 
     IEnumerable<Customer> customers = customerRepository.Get(); 
     return customers; 
    } 

    public Customer GetCustomers(int id) 
    { 
     ICustomerRepository customerRepository = _DataRepositoryFactory.GetDataRepository<ICustomerRepository>(); 
     Customer customer = customerRepository.Get(id); 
     return customer; 
    } 
} 

[TestMethod] 
public void GetById() 
{ 
    List<Customer> customers = new List<Customer>() 
    { 
     new Customer() { CustomerId = 1, FirstName = "AAA" }, 
     new Customer() { CustomerId = 2, FirstName = "BBB" } 
    }; 

    Mock<ICustomerRepository> mockCustomerRepository = new Mock<ICustomerRepository>(); 
    mockCustomerRepository.Setup(obj => obj.Get()).Returns(customers); 

    Mock<IDataRepositoryFactory> mockDataRepository = new Mock<IDataRepositoryFactory>(); 
    mockDataRepository.Setup(obj => obj.GetDataRepository<ICustomerRepository>()).Returns(mockCustomerRepository.Object); 

    DataClassFactory dataClassFactory = new DataClassFactory(mockDataRepository.Object); 

    Customer ret = dataClassFactory.GetCustomers(2); 

    Assert.IsNotNull(ret); 
} 

public interface IDataRepositoryFactory 
{ 
    T GetDataRepository<T>() where T : IDataRepository; 
} 

public interface IDataRepository{} 

public interface IDataRepository<T> : IDataRepository 
    where T : class, IIdentifiableEntity, new() 
{ 
    IEnumerable<T> Get(); 
    T Get(int id); 
} 

public abstract class DataRepositoryBase<T, U> : IDataRepository<T> 
    where T : class, IIdentifiableEntity, new() 
    where U : DbContext, new() 
{ 
    protected abstract DbSet<T> DbSet(U entityContext); 
    protected abstract Expression<Func<T, bool>> IdentifierPredicate(U entityContext, int id); 

    T AddEntity(U entityContext, T entity) 
    { 
     return DbSet(entityContext).Add(entity); 
    } 

    IEnumerable<T> GetEntities(U entityContext) 
    { 
     return DbSet(entityContext).ToFullyLoaded(); 
    } 

    T GetEntity(U entityContext, int id) 
    { 
     return DbSet(entityContext).Where(IdentifierPredicate(entityContext, id)).FirstOrDefault(); 
    } 

    public IEnumerable<T> Get() 
    { 
     using (U entityContext = new U()) 
      return (GetEntities(entityContext)).ToArray().ToList(); 
    } 

    public T Get(int id) 
    { 
     using (U entityContext = new U()) 
      return GetEntity(entityContext, id); 
    } 
} 

GetById 시험 방법에

public class DataClassFactory 
{ 
    [Import] 
    IDataRepositoryFactory _DataRepositoryFactory; 

    public DataClassFactory() 
    { 
     ObjectBase.Container.SatisfyImportsOnce(this); 
    } 

    public DataClassFactory(IDataRepositoryFactory dataRepositoryFactory) 
    { 
     _DataRepositoryFactory = dataRepositoryFactory; 
    } 

    public IEnumerable<Customer> GetCustomers() 
    { 
     ICustomerRepository customerRepository = _DataRepositoryFactory.GetDataRepository<ICustomerRepository>(); 
     IEnumerable<Customer> customers = customerRepository.Get(); 
     return customers; 
    } 

    public Customer GetCustomers(int id) 
    { 
     ICustomerRepository customerRepository = _DataRepositoryFactory.GetDataRepository<ICustomerRepository>(); 
     Customer customer = customerRepository.Get(id); 
     return customer; 
    } 
} 
+0

것 같습니다 해결해야한다. –

+0

모의를 사용하여 Get()으로 목록을 가져온 다음이 모의 (이 목록)를 사용하여 쿼리를 만듭니다. –

+0

우리가 볼 수 없는데,'DataClassFactory'를 추가하면 도움이 될 것입니다. –

답변

1

업데이트 당신은 GetCustomers(int id) 과부하로 이동 dataClassFactory.GetCustomers(2) 사용합니다. 그 오버로드는 customerRepository.Get(id)을 호출하고 있습니다.이 오버로드는 여러분이 모의하지 않은 오버로드입니다. 이것이 null을 반환하는 이유입니다.

이것은 널 (null) 반환 왜 그렇게 그 설명, 당신은 단지 설정`()`를 얻고`오기 (INT 아이디) '을 위해 그렇게하지 않은 것처럼

Mock<ICustomerRepository> mockCustomerRepository = new Mock<ICustomerRepository>(); 
mockCustomerRepository.Setup(obj => obj.Get()).Returns(customers); 
mockCustomerRepository.Setup(obj => obj.Get(It.IsAny<int>())).Returns((int i) => customers.FirstOrDefault(c => c.CustomerId == i)); // This is the new part 
+0

이 작업을 수행 할 때마다 고객 [0] (id = 1)이 항상 표시되고 GetCustomers (2)의 2는 테스트에 영향을주지 않습니다. –

+0

당신이 당신이이 행동을 달성하려고 노력하고 있다고 말하지 않았기 때문에 그것을 돌 보지 않았다. 나의 대답에 업데이트 된 예제를 사용하라. –

관련 문제