如何单元测试中的函数模拟的方法 [英] How to UnitTest a Function in a mocked method

查看:143
本文介绍了如何单元测试中的函数模拟的方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我怎么可以在这里测试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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆