0

这是在 3 天的研究和编写代码之后发生的。我有 EF Code First (EF5) 和基于它构建的通用存储库模式。 基础设施

现在我有ICustomerRepository<Customer> : IRepository and CustomerRepository : RepositoryBase<MyContext> , ICustomerRepository. 因此,当我开始对此进行测试时,我发现我必须编写 A FakeDbContext 、 A Fake IDbSet ,然后还要伪造数据,并且还要做很多事情。当我知道我将使用我的内存数据和 Linq to Entities 测试 Linq to Objects 时,所有这一切都需要以集成测试的形式进行另一套测试。因此,要么我的代码结构错误,因此编写单元测试非常困难,要么有更好的方法来编写我不知道的测试,或者我应该只进行集成测试。我正在使用 NUnit 和最小起订量。

编辑:我要测试的是什么?我正在尝试检查 GetCustomersByType 、 Add 、 GetOrderPlacedByCustomer 等方法。试图查看这些方法中的逻辑是否正确。我猜这就是单元测试的用途。

4

2 回答 2

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();
    }
于 2012-11-29T12:48:07.100 回答
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>不创建真实实体。

于 2012-11-29T12:50:50.457 回答