Moq ReturnsAsync 使用许多参数
Moq ReturnsAsync using many parameters
我一直在使用 Moq 的 ReturnsAsync
函数并取得了一些成功,但遇到了以下问题。当我将参数添加到我的 lambda 表达式时,我总是 return null ...这次当我将它们全部添加时,我得到了可怕的“无法将 lambda 表达式转换为类型...”有什么很明显我错了? Setup
方法解析得很好......只是不是 ReturnsAsync
可以定义多少个参数有限制吗?我已经尝试并注意到它在第 15 个参数之后出现问题...
var buildServiceMock = new Mock<IBuildService>();
buildServiceMock
.Setup(bsm => bsm.QueryBuildsAsync(
It.IsAny<BuildType>(),
It.IsAny<string>(),
It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(),
It.IsAny<string>(),
It.IsAny<BuildReason?>(),
It.IsAny<BuildStatus?>(),
It.IsAny<BuildResult?>(),
It.IsAny<IEnumerable<string>>(),
It.IsAny<IEnumerable<string>>(),
It.IsAny<int?>(),
It.IsAny<int?>(),
It.IsAny<QueryDeletedOption?>(),
It.IsAny<BuildQueryOrder?>(),
It.IsAny<string>(),
It.IsAny<IEnumerable<int>>(),
It.IsAny<string>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync((
BuildType buildType,
string buildNumber,
DateTime? minDateTime,
DateTime? maxDateTime,
string requestedFor,
BuildReason? reasonFilter,
BuildStatus? statusFilter,
BuildResult? resultFilter,
IEnumerable<string> tags,
IEnumerable<string> properties,
int? top,
int? maxBuildsPerDefinition,
QueryDeletedOption? deletedFilter,
BuildQueryOrder? queryOrder,
string branchName,
IEnumerable<int> buildIds,
string label,
CancellationToken cancellationToken) =>
{
return null;
});
我发现问题的根源是这个...
public static IReturnsResult<TMock> ReturnsAsync<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMock, TResult>(this IReturns<TMock, ValueTask<TResult>> mock, Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult> valueFunction) where TMock : class;
ReturnsAsync 最多只允许您在 lambda 表达式的签名中使用最多 15 个参数。
但是我只需要在我的 ReturnsAsync 委托方法中使用一个 IEnumerable,所以我很好...我误以为我必须为方法中模拟的每个参数指定一个参数“设置”调用...既然我发现您不需要这样做,我就可以开始了。 :)
我一直在使用 Moq 的 ReturnsAsync
函数并取得了一些成功,但遇到了以下问题。当我将参数添加到我的 lambda 表达式时,我总是 return null ...这次当我将它们全部添加时,我得到了可怕的“无法将 lambda 表达式转换为类型...”有什么很明显我错了? Setup
方法解析得很好......只是不是 ReturnsAsync
可以定义多少个参数有限制吗?我已经尝试并注意到它在第 15 个参数之后出现问题...
var buildServiceMock = new Mock<IBuildService>();
buildServiceMock
.Setup(bsm => bsm.QueryBuildsAsync(
It.IsAny<BuildType>(),
It.IsAny<string>(),
It.IsAny<DateTime?>(),
It.IsAny<DateTime?>(),
It.IsAny<string>(),
It.IsAny<BuildReason?>(),
It.IsAny<BuildStatus?>(),
It.IsAny<BuildResult?>(),
It.IsAny<IEnumerable<string>>(),
It.IsAny<IEnumerable<string>>(),
It.IsAny<int?>(),
It.IsAny<int?>(),
It.IsAny<QueryDeletedOption?>(),
It.IsAny<BuildQueryOrder?>(),
It.IsAny<string>(),
It.IsAny<IEnumerable<int>>(),
It.IsAny<string>(),
It.IsAny<CancellationToken>()))
.ReturnsAsync((
BuildType buildType,
string buildNumber,
DateTime? minDateTime,
DateTime? maxDateTime,
string requestedFor,
BuildReason? reasonFilter,
BuildStatus? statusFilter,
BuildResult? resultFilter,
IEnumerable<string> tags,
IEnumerable<string> properties,
int? top,
int? maxBuildsPerDefinition,
QueryDeletedOption? deletedFilter,
BuildQueryOrder? queryOrder,
string branchName,
IEnumerable<int> buildIds,
string label,
CancellationToken cancellationToken) =>
{
return null;
});
我发现问题的根源是这个...
public static IReturnsResult<TMock> ReturnsAsync<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TMock, TResult>(this IReturns<TMock, ValueTask<TResult>> mock, Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, TResult> valueFunction) where TMock : class;
ReturnsAsync 最多只允许您在 lambda 表达式的签名中使用最多 15 个参数。
但是我只需要在我的 ReturnsAsync 委托方法中使用一个 IEnumerable,所以我很好...我误以为我必须为方法中模拟的每个参数指定一个参数“设置”调用...既然我发现您不需要这样做,我就可以开始了。 :)