有没有一种正确的方法来测试EF Code First Repository Pattern?

时间:2012-11-29 12:28:04

标签: c# entity-framework unit-testing ef-code-first repository-pattern

经过3天的研究和编写代码之后。我有EF Code First(EF5)和基于它的通用存储库模式。 Infrastructure

现在我有ICustomerRepository<Customer> : IRepository and CustomerRepository : RepositoryBase<MyContext> , ICustomerRepository。因此,当我进行测试时,我发现我必须编写一个FakeDbContext,一个伪IDbSet,然后伪造数据并做更多的事情。所有这一切,当我知道我将使用我的内存数据和Linq to Entities测试Linq到Objects时,需要以集成测试的形式进行另一套测试。所以,我的代码结构是错误的,因此编写单元测试是如此困难,或者有更好的方法来编写我不知道的测试,或者我应该只进行集成测试。我正在使用NUnit和MOQ。

编辑:我试图测试的是什么? 我正在尝试检查GetCustomersByType,Add,GetOrderPlacedByCustomer等方法。试着看看这些方法中的逻辑是否正确。我想这就是单元测试的目的。

2 个答案:

答案 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>来创建实体。