如何对将项目添加到数据库的方法进行单元测试?

dtm*_*mnn 4 c# database unit-testing

我有一个项目,正在使用此方法将其添加到数据库中:

public Messages addItem(Item item)
{

    Messages resultMessage = Messages.Success;

    using (IUnitOfWork unitOfWork = new UnitOfWork())
    {
        IItemRepository itemRep = new ItemRepository(unitOfWork);

        try
        {
            itemRep.Insert(item);

            unitOfWork.Commit();
        }
        catch (Exception e)
        {
            Console.WriteLine(e.StackTrace);
            resultMessage = Messages.DB_Failure;
        }
    }    
    return resultMessage;   
}
Run Code Online (Sandbox Code Playgroud)

现在,我必须为此方法编写一个单元测试,以检查是否将该项目添加到数据库中。我不知道该怎么做,有人可以帮我吗?

Jua*_*uan 6

您的代码与ItemRepository和UnitOfWork实现结合在一起。理想情况下,您应该解耦它们并使用模拟来验证是否调用了正确的方法。

可能的解决方案:

  1. 将存储库设为工作单元的属性
  2. 不要直接创建工作单元,而要使用工厂
  3. 使工厂成为您班级的依赖
  4. 在测试中,将工厂的模拟传递给您要测试的类,该模拟返回工作单元的模拟
  5. 在您的UoW模拟中返回存储库的模拟
  6. 验证是否在存储库模拟和工作单元模拟中调用了正确的方法

这将是一个例子。我已经使用Moq作为模拟框架。并将测试方法放入类中,但是您可以了解一下:

class MyClass
{
    private readonly IUnitOfWorkFactory _factory;

    public MyClass(IUnitOfWorkFactory factory)
    {
        _factory = factory;
    }

    public Messages addItem(Item item)
    {
        Messages resultMessage = Messages.Success;

        using (IUnitOfWork unitOfWork = _factory.GetUnitOfWork())
        {
            try
            {
                unitOfWork.ItemRep.Insert(item);

                unitOfWork.Commit();
            }

            catch (Exception e)
            {
                Console.WriteLine(e.StackTrace);
                resultMessage = Messages.DB_Failure;
            }


        }

        return resultMessage;
    }


    public void Test()
    {
        // Arrange
        var factoryMock = new Mock<IUnitOfWorkFactory>();
        var uowMock = new Mock<IUnitOfWork>();
        var repositoryMock = new Mock<IItemRepository>();

        factoryMock.Setup(f => f.GetUnitOfWork()).Returns(uowMock.Object);
        uowMock.Setup(u => u.ItemRep).Returns(repositoryMock.Object);

        var sut = new MyClass(factoryMock.Object);

        // Act
        var item = new Item();
        sut.addItem(item);


        // Assert
        repositoryMock.Verify(r => r.Insert(item), Times.Once);
        uowMock.Verify(u => u.Commit(), Times.Once);
    }
}
Run Code Online (Sandbox Code Playgroud)