조롱을 위해 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;
}
}
것 같습니다 해결해야한다. –
모의를 사용하여 Get()으로 목록을 가져온 다음이 모의 (이 목록)를 사용하여 쿼리를 만듭니다. –
우리가 볼 수 없는데,'DataClassFactory'를 추가하면 도움이 될 것입니다. –