Moq单元测试,如何更新单个属性



我正在使用nUnit和Moq编写一些单元测试,这需要大量的数据模拟。我创建了一个helper方法,以避免在每个单独的测试中模拟数据。这是一个简化版本:

protected void MockLotsOfData()
{
var orders = new List<Order>()
{
new Order()
{
Id = 1234,
Total = 67.95
ExpressShip = false
},
new Order() 
{
Id = 5678,
Total = 178.34
ExpressShip = false
}
}

var mockDbSetOrders = orders.AsMockDbSet();
this._mockDbContext.Setup(x => x.ORDERS).Returns(mockDbSetOrders.Object);
}

然后,我想更改集合中的单个属性,以便能够进行测试。以下是更简化的代码:

[Test, Category("Unit")]
public void OrderService_ProcessOrderWithExpressShipping_ReturnsSuccess()
{
//Arrange
var service = this.CreateService();
var request = new OrderRequest() { OrderNumber = 1234 };
this.MockLotsOfData();
// Need help here, how to change value of'ExpressShip' property for order Id = 1234?
this._mockDbContext.SetupProperty(x => x.ORDERS.Where(y => y.Id = 1234)).Select(z => z.ExpressShip).Returns(true);
//Act
var response = service.ProcessOrder(request);
//Assert
Assert.IsTrue(response.Successful);
}

我想做的是从模拟数据中更新一个值,这样我就可以测试不同的场景。这可能吗?

我建议从mocking方法返回Orders-列表,而不是mock本身。因此,你可以随心所欲地更改该对象,然后告诉moq使用该对象进行伪造:

protected List<Order> CreateData()
{
return new List<Order>()
{
new Order()
{
Id = 1234,
Total = 67.95
ExpressShip = false
},
new Order() 
{
Id = 5678,
Total = 178.34
ExpressShip = false
}
}
}

现在您可以轻松地操作数据:

var orders = CreateData();
orders[0].ExpressShip = false;

最后向Moq:提供该对象

var mockDbSetOrders = orders.AsMockDbSet();
this._mockDbContext.Setup(x => x.ORDERS).Returns(mockDbSetOrders.Object);

只是一个助手:我认为您不需要将列表包装到mockDbSetOrders中,然后用mockDbSetOrders.Object打开包装。只需直接使用orders-对象:

this._mockDbContext.Setup(x => x.ORDERS).Returns(orders);

最新更新