如何单元测试中的函数模拟的方法 [英] How to UnitTest a Function in a mocked method
问题描述
我怎么可以在这里测试DeleteAppointmentById
Func键< IDataAdapterRW,IEnumerable的< UINT>>功能= DB => DeleteAppointmentById(DB,appointmentId);
返回_dataContextProvider.GetContextRW()运行(功能);
_dataContextProvider被嘲笑与起订量。如果我运行测试它从未进入DeleteAppointmentById当然
的方法进行测试:
公开的IEnumerable< UINT> DeleteAppointment(UINT appointmentId)
{
Func键< IDataAdapterRW,IEnumerable的< UINT>>功能= DB => DeleteAppointmentById(DB,appointmentId);
返回_dataContextProvider.GetContextRW()运行(功能);
}
DeleteAppointmentById是内部方法(私)我真正感兴趣。
我的测试:
[测试]
公共无效DeleteAppointment_Valid_DeletedRecordId ()
{
//设置
变种dbContextMock =新的模拟< IDataContextProvider>();
变种dataAdapterMock =新的模拟< IDataContext< IDataAdapterRW>>();
dbContextMock.Setup(D => d.GetContextRW())
.Returns(dataAdapterMock.Object);
dataAdapterMock.Setup(A => a.Run(It.IsAny<作用< IDataAdapterRW>>()));
变种calendarService =新CalendarService(dbContextMock.Object);
//运行
VAR的结果= calendarService.DeleteAppointment(1);
//断言
Assert.AreEqual(1,结果);
}
可以的访问结果传递函数功能
作为在运行参数
方法,以及断言的类似下面的结果。
为什么要返回的结果?因为它是一个模拟和的不知道如何的运行
方法的的行为的。
[测试]
公共无效DeleteAppointment_Valid_DeletedRecordId()
{
//设置
VAR dbContextMock =新的模拟< IDataContextProvider>();
变种dataAdapterMock =新的模拟< IDataContext< IDataAdapterRW>>();
dbContextMock.Setup(D => d.GetContextRW())
.Returns(dataAdapterMock.Object);
dataAdapterMock.Setup(A => a.Run(It.IsAny< Func键< IDataAdapterRW,IEnumerable的< UINT>>>()))
.Returns((Func键< IDataAdapterRW,IEnumerable的< UINT>> FUNC)=> {返回FUNC(dataAdapterMock.Object);}); //配置模拟返回列表
变种calendarService =新CalendarService(dbContextMock.Object);
//运行
INT ID = 1;
VAR的结果= calendarService.DeleteAppointment(ID);
//断言
VAR isInList = result.Contains(ID); //验证结果是否包含
Assert.AreEqual(isInList,真);
}
How can I test the DeleteAppointmentById here?
Func<IDataAdapterRW, IEnumerable<uint>> function = db => DeleteAppointmentById(db, appointmentId);
return _dataContextProvider.GetContextRW().Run(function);
_dataContextProvider is mocked with moq. If I run the test it never enters DeleteAppointmentById of course
The method to test:
public IEnumerable<uint> DeleteAppointment(uint appointmentId)
{
Func<IDataAdapterRW, IEnumerable<uint>> function = db => DeleteAppointmentById(db, appointmentId);
return _dataContextProvider.GetContextRW().Run(function);
}
DeleteAppointmentById is the inner method (private) I am really interested in.
my test:
[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);
}
You can access the result of the Func
passed as parameter in Run
method, and to Assert the result like below.
Why to return the result? Because it's a mock and don't know how Run
method is behaving.
[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<Func<IDataAdapterRW, IEnumerable<uint>>>()))
.Returns((Func<IDataAdapterRW, IEnumerable<uint>> func) => { return func(dataAdapterMock.Object);}); // configure the mock to return the list
var calendarService = new CalendarService(dbContextMock.Object);
//Run
int id = 1;
var result = calendarService.DeleteAppointment(id);
//Assert
var isInList = result.Contains(id); // verify the result if contains the
Assert.AreEqual(isInList, true);
}
这篇关于如何单元测试中的函数模拟的方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!