0

这是在3天的研究和编写代码之后。我有EF Code First(EF5)和一个建立在它之上的通用存储库模式。我们有ICustomerRepository<Customer> : IRepository and CustomerRepository : RepositoryBase<MyContext> , ICustomerRepository。所以当我去测试这个时,我发现我必须写一个FakeDbContext,一个假IDbSet,然后伪造这些数据,并且做更多的事情。所有这一切,当我知道我将使用我的内存数据测试Linq到Objects时,Linq to Entities将需要以集成测试的形式进行另一套测试。所以,无论是我的代码结构是错误的,因此编写单元测试非常困难,或者有更好的方法来编写我不知道的测试,或者我应该只进行集成测试。我正在使用NUnit和MOQ。有没有正确的方法来测试EF代码优先库模式?

编辑:我试图测试什么? 我想检查GetCustomersByType,Add,GetOrderPlacedByCustomer等方法。试图查看这些方法内部的逻辑是否正确。这是什么单元测试的,我猜。

+1

*你想要测试什么?测试有什么目的? –

+0

然后,是的 - 对于那种单元测试,您需要创建假数据结构。你可以通过创建你自己的实现或者通过嘲笑来做到这一点。我建议在你正在测试的东西的最外边界利用嘲弄。 –

+0

如果我嘲笑我的背景他们我的单元测试将参考EF,这是一个好主意吗?我不确定,只是试图让我的头在这附近。 –

回答

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("[email protected]", "John Doe", "johndoe"); 

     _usersRepository.Add(u); 
     _unitOfWork.Commit(); 
    } 
+0

,那么这样的测试将需要很长时间才能运行,因此不符合单元测试的要求。 –

1

您可以使用TransactionScope模拟DB访问,但没有提交到数据库中的实际变化。事情是这样的:

[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>不创建实体。

+0

是一个好主意,适用于我担心我的分贝。我现在不想对数据库进行测试。一旦我知道我的代码中的逻辑是正确的,我会这样做。 –

+0

你也可以从现在开始使用它。 ;)您可以在实际的DbSet和DbContext上编写测试,而不会以任何方式在内部影响它们(或内部的数据)。您可以(例如)编写一个生成测试数据的方法,并将其添加到DbContext并从事务范围内调用此方法。 – Carsten

+0

虽然没有答案我正在寻找你的文章,在我的集成测试中非常有用。我肯定会使用的东西。 –

相关问题