如何在模拟方法中单元测试函数

时间:2015-04-17 05:38:52

标签: c# unit-testing moq

如何在这里测试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);
    }

2 个答案:

答案 0 :(得分:2)

您可以Func Run作为参数传递给Run方法,断言结果如下所示。

为什么要返回结果?因为它是一个模拟而不知道 [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); } 方法的行为

{{1}}

答案 1 :(得分:1)

单元测试倾向于采用以下结构:

  • 安排:设置上下文。在这种情况下,您可能会创建约会并将其保存到数据库中。

  • 法案:致电您正在测试的单位。在这种情况下,DeleteAppointmentById(db,appointment)。

  • 断言:检查副作用和回报是否正确。在这种情况下,您可能会尝试从数据库加载此约会,并断言您无法(因为它应该已被删除)。