c# - 使用可选参数模拟异步方法会抛出 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](Expression
1 表达式)
我究竟做错了什么?
解决方案
似乎您使用错误的方法进行模拟设置。您应该使用用于属性获取器的Setup
方法。SetupGet
尝试以下操作:
service.Setup(x =>
x.GetRecentMeetingsMostRecentFirstAsync(
It.IsAny<IWho>(),
It.IsAny<TimeSpan?>(),
It.IsAny<int?>()))
.Returns((IList<IMeeting>)new List<IMeeting>()));
也没有必要使用Task.FromResult
,因为它是一个模拟对象,所以没有任何异步发生。
推荐阅读
- cordova - Cordova InAppBrowser 清除搜索历史
- python-3.x - TypeError:parser_f() 为参数 'sep' 获得了多个值
- java - 当我使用内部服务器时,如何解决我的 IOException 问题。(Java/安卓)
- reactjs - 当其数据由第二个点击事件确定时,如何向下钻取到第三级?
- html - 将整页拆分为 div 三角形和形状并将文本放入其中
- php - PHP如何检查数组是否没有键和值
- java - 想要我的 webview 的 Internet 警报框
- sql - 可以结合日期和时间并存储为日期时间格式
- javascript - 在多个元素中将进度条显示为滚动
- javascript - 使用计算将对象数组转换为数组