Moq框架:模拟添加对象

本文关键字:添加 对象 模拟 框架 Moq | 更新日期: 2023-09-27 18:27:54

我刚开始使用Moq进行单元测试,在尝试将对象添加到我们的repo时遇到了问题。基本上,我们有一个表示数据库结构的接口。该接口包含表示该数据库中数据的附加接口,如下所示:

public interface IUnitOfWork : IDisposable
{
    IRepository<Order> OrdersRepo { get; }
    IRepository<Customer> CustomerRepo { get; }
    IRepository<Product> ProductsRepo { get; }
}

创建模拟IUnitOfWork是没有问题的,当我试图将订单对象添加到OrdersRepo时,问题就会出现,如下所示:

[TestClass]
public class OrderTest
{
    private Mock<IUnitOfWork> mockDB = new Mock<IUnitOfWork>();
    private IUnitOfWork testDB;
    private Order testOrder;
    [TestInitialize]
    public void Initialize()
    {
        //Create the test order
        testOrder = new Order();
        testOrder.ID = 123;
        //Setting up the Moq DB
        testDB = mockDB.Object;
    }
    [TestMethod]
    public void AddOrder_ValidOrder_OrderAdded()
    {   
        testDB.OrdersRepo.Add(testOrder);
    }
}

当我尝试添加订单时,我一直得到一个NullReferenceException。我认为这是因为testDB中的OrdersPo是一个接口。然而,当我试图为此创建一个模拟回购时,我遇到了一个错误,说OrdersRepo是只读的,因为它是{get;}而不是{get;set;}。

当回购仅为get时,我是否可以使用Moq来测试添加我的订单对象;接口是什么?

Moq框架:模拟添加对象

您得到NullReferenceException是因为您还没有设置mock对象。如果您只想设置一个属性,请使用

mockDB.SetupProperty(self => self.OrdersRepo);

如果你想设置属性使用你自己的枚举,你可以使用

var collection = <Init collection here>;
mockDB.SetupGet(self => self.OrdersRepo).Returns(collection);

或者,如果你想设置所有属性,你可以使用

mockDB.SetupAllProperties();

如果你想测试你的订单回购,那么你不需要通过IUnitOfWork,然后嘲笑订单回购,因为这样你就不是在测试你的主题。您应该实例化您的具体订单回购,并调用应可公开访问的Add方法。也许你需要模拟你的底层数据库客户端,你的订单回购正在调用数据库,但那是另一回事。

希望能有所帮助。