首页 > 解决方案 > 使用可选参数模拟异步方法会抛出 Expression is not a Property Access

问题描述

我正在使用 Nuget 包 Moq (v4.13.1)

我试图模拟的类/方法具有以下接口:

public interface IAgendaService
{
    Task<IList<IMeeting>> GetRecentMeetingsMostRecentFirstAsync(
        IWho who,
        TimeSpan? timeSpan = null,
        int? maxNumberOfMeetings = null);
}

在我的测试方法中,我有以下代码来定义 Mock:

        Mock<IAgendaService> service = new Mock<IAgendaService>(MockBehavior.Strict);

        service.SetupGet(x =>
                x.GetRecentMeetingsMostRecentFirstAsync(
                    It.IsAny<IWho>(),
                    It.IsAny<TimeSpan?>(),
                    It.IsAny<int?>()))
            .Returns(Task.FromResult((IList<IMeeting>)new List<IMeeting>()));

当我运行测试时, service.SetupGet() 抛出以下异常:

测试方法 Agenda.Web.Tests.Controllers.HomeController.IndexTests.TestIndex 抛出异常:System.ArgumentException:表达式不是属性访问:x => x.GetRecentMeetingsMostRecentFirstAsync(It.IsAny(), It.IsAny(), It。 IsAny()) 在 Moq.ExpressionExtensions.ToPropertyInfo(LambdaExpression 表达式) 在 Moq.Mock.SetupGet(Mock mock, LambdaExpression expression, Condition condition) 在 Moq.Mock 1.SetupGet[TProperty](Expression1 表达式)

我究竟做错了什么?

标签: c#unit-testingmockingmoq

解决方案


似乎您使用错误的方法进行模拟设置。您应该使用用于属性获取器的Setup方法。SetupGet尝试以下操作:

service.Setup(x =>
            x.GetRecentMeetingsMostRecentFirstAsync(
                It.IsAny<IWho>(),
                It.IsAny<TimeSpan?>(),
                It.IsAny<int?>()))
        .Returns((IList<IMeeting>)new List<IMeeting>()));

也没有必要使用Task.FromResult,因为它是一个模拟对象,所以没有任何异步发生。


推荐阅读