Ste*_*ght 1 c# unit-testing moq mocking
我正在使用 Nuget 包 Moq (v4.13.1)
我试图模拟的类/方法具有以下接口:
public interface IAgendaService
{
Task<IList<IMeeting>> GetRecentMeetingsMostRecentFirstAsync(
IWho who,
TimeSpan? timeSpan = null,
int? maxNumberOfMeetings = null);
}
Run Code Online (Sandbox Code Playgroud)
在我的测试方法中,我有以下代码来定义模拟:
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>()));
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,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 模拟,LambdaExpression 表达式,Condition 条件) 在 Moq.Mock 1.SetupGet[TProperty](Expression1 表达式)
我究竟做错了什么?
您似乎使用了错误的方法来进行模拟设置。您应该使用属性 getter 所使用的Setup方法。SetupGet尝试以下操作:
service.Setup(x =>
x.GetRecentMeetingsMostRecentFirstAsync(
It.IsAny<IWho>(),
It.IsAny<TimeSpan?>(),
It.IsAny<int?>()))
.Returns((IList<IMeeting>)new List<IMeeting>()));
Run Code Online (Sandbox Code Playgroud)
也不需要使用,Task.FromResult因为它是一个模拟对象,所以没有任何异步发生。