【发布时间】:2015-04-17 05:38:52
【问题描述】:
如何在此处测试 DeleteAppointmentById?
Func<IDataAdapterRW, IEnumerable<uint>> function = db => DeleteAppointmentById(db, appointmentId);
return _dataContextProvider.GetContextRW().Run(function);
_dataContextProvider 是用 moq 模拟的。如果我运行测试,它当然永远不会进入 DeleteAppointmentById
测试方法:
public IEnumerable<uint> DeleteAppointment(uint appointmentId)
{
Func<IDataAdapterRW, IEnumerable<uint>> function = db => DeleteAppointmentById(db, appointmentId);
return _dataContextProvider.GetContextRW().Run(function);
}
DeleteAppointmentById 是我真正感兴趣的内部方法(私有)。
我的测试:
[Test]
public void DeleteAppointment_Valid_DeletedRecordId()
{
//Setup
var dbContextMock = new Mock<IDataContextProvider>();
var dataAdapterMock = new Mock<IDataContext<IDataAdapterRW>>();
dbContextMock.Setup(d => d.GetContextRW())
.Returns(dataAdapterMock.Object);
dataAdapterMock.Setup(a => a.Run(It.IsAny<Action<IDataAdapterRW>>()));
var calendarService = new CalendarService(dbContextMock.Object);
//Run
var result = calendarService.DeleteAppointment(1);
//Assert
Assert.AreEqual(1, result);
}
【问题讨论】:
-
在这种情况下这几乎是不可能回答的,因为所有重要信息都丢失了(你嘲笑的
dataContextProvider为GetContextRW()返回什么?这又被嘲笑了吗?你期望什么?应该DeleteAppointmentById所有一些方法还是你想检查行为(如@Luke)试图回答? -
您能解释一下您要达到的目标吗?从你所说的很难做出什么。
-
对不起,我更新了问题,希望现在更清楚.. DeleteAppointmentById 中包含很多与数据上下文无关的逻辑。我想模拟所有数据上下文,并在该私有方法中测试逻辑。
-
hmmm...几天前您没有问过几乎相同的问题吗? - 是的,就在昨天:stackoverflow.com/questions/29670372/… - 我投票关闭那里的问题,因为你在这里提供了更多信息 - 但请不要多次发布相同的问题 - 谢谢
-
再次:您想检查您的
DeleteAppointmentById是否在IDataAdapterRW上调用了某个方法,还是要检查行为?在第一种情况下,如果在您的dataAdapterMock上进行了正确的调用,您只需要Verify- 在第二种情况下,您应该模拟IDataAdapterRW,以便您可以跟踪项目的插入和移除并执行@Luke 在下面提出了什么(但不是在真正的 DB IMO 上)
标签: c# unit-testing moq