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来测试添加我的订单对象;接口是什么?
您得到NullReferenceException是因为您还没有设置mock对象。如果您只想设置一个属性,请使用
mockDB.SetupProperty(self => self.OrdersRepo);
如果你想设置属性使用你自己的枚举,你可以使用
var collection = <Init collection here>;
mockDB.SetupGet(self => self.OrdersRepo).Returns(collection);
或者,如果你想设置所有属性,你可以使用
mockDB.SetupAllProperties();
如果你想测试你的订单回购,那么你不需要通过IUnitOfWork,然后嘲笑订单回购,因为这样你就不是在测试你的主题。您应该实例化您的具体订单回购,并调用应可公开访问的Add方法。也许你需要模拟你的底层数据库客户端,你的订单回购正在调用数据库,但那是另一回事。
希望能有所帮助。