经过3天的研究和编写代码之后。我有EF Code First(EF5)和基于它的通用存储库模式。
现在我有ICustomerRepository<Customer> : IRepository and
CustomerRepository : RepositoryBase<MyContext> , ICustomerRepository
。因此,当我进行测试时,我发现我必须编写一个FakeDbContext,一个伪IDbSet,然后伪造数据并做更多的事情。所有这一切,当我知道我将使用我的内存数据和Linq to Entities测试Linq到Objects时,需要以集成测试的形式进行另一套测试。所以,我的代码结构是错误的,因此编写单元测试是如此困难,或者有更好的方法来编写我不知道的测试,或者我应该只进行集成测试。我正在使用NUnit和MOQ。
编辑:我试图测试的是什么? 我正在尝试检查GetCustomersByType,Add,GetOrderPlacedByCustomer等方法。试着看看这些方法中的逻辑是否正确。我想这就是单元测试的目的。
答案 0 :(得分:2)
我认为如果您创建一个测试初始化方法,在每次测试之前设置所有数据,即黑框测试,您将获得更多。最后,您将知道存储库层正在真实数据库上正常工作,而不是模拟数据库。
例如:
public static void Init()
{
_unityContainer = new UnityContainer();
_unityContainer.LoadConfiguration();
_persistenceFactory = _unityContainer.Resolve<IPersistenceFactory>();
_unitOfWork = _persistenceFactory.GetUnitOfWork();
_usersRepository = _persistenceFactory.GetUsersRepository();
_usersRepository.RemoveAll();
_unitOfWork.Commit();
}
public static void InsertTestData()
{
User u = new User("johndoe@gmail.com", "John Doe", "johndoe");
_usersRepository.Add(u);
_unitOfWork.Commit();
}
答案 1 :(得分:1)
您可以使用TransactionScope
来模拟数据库访问,但不能将实际更改提交到数据库。像这样:
[TestMethod]
public void AddingShouldWork()
{
using (var transaction = new TransactionScope())
{
var repository = new ICustomerRepository<Customer>();
var customer = new Customer();
customer.Name = "OEM Computers Inc.";
repository.Add(customer);
}
}
通过不调用transaction.Complete()
,操作被视为回滚,导致没有数据库插入。这只是您想要进行单元(非集成)测试的行为。您也可以使用Moq<Customer>
来创建实体。