bee*_*cus 14 c# delegates action moq
我有一个我想要Moq的功能.问题是需要5个参数.该框架仅包含Action<T1,T2,T3,T4>和Moq的通用CallBack()仅重载Action和四个通用版本.这有一个优雅的解决方法吗?
这就是我想要做的:
public class Filter : IFilter
{
public int Filter(int i1, int i2, int i3, int i4, int i5){return 0;}
}
//Moq code:
var mocker = new Mock<IFilter>();
mocker.Setup(x => x.Filter(
It.IsAny<int>(),
It.IsAny<int>(),
It.IsAny<int>(),
It.IsAny<int>(),
It.IsAny<int>(),
It.IsAny<int>())
.Callback
(
(int i1, int i2, int i3, int i4, int i5) => i1 * 2
);
Run Code Online (Sandbox Code Playgroud)
Moq不允许这样做,因为没有通用的Action需要5个参数.我已经使用了自己的存根.显然,最好使用Moq及其所有验证等.
小智 5
我知道这是一个旧帖子,但我认为这段代码可能会帮助其他人在旧版Moq中遇到此问题.这是一个带有5和6个参数的示例,它可以扩展为支持任何数字.
我已经使用3.1.0.0版本对此进行了测试,但它应该与其他版本一起使用.
秘诀是使用反射来访问底层类的受保护方法'SetCallbackWithArguments'...
希望这对某人有用!
public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
public delegate void Action<T1, T2, T3, T4, T5, T6>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5, T6 arg6);
public static class MoqExtensions
{
public static ICallbackResult Callback<T1, T2, T3, T4, T5>(this ICallback call, Action<T1, T2, T3, T4, T5> callback)
{
call.SetCallbackWithArguments(callback);
return (ICallbackResult)call;
}
public static ICallbackResult Callback<T1, T2, T3, T4, T5, T6>(this ICallback call, Action<T1, T2, T3, T4, T5, T6> callback)
{
call.SetCallbackWithArguments(callback);
return (ICallbackResult)call;
}
public static void SetCallbackWithArguments(this ICallback call, Delegate callback)
{
MethodInfo methodInfo = call.GetType().GetMethod("SetCallbackWithArguments", BindingFlags.NonPublic | BindingFlags.Instance);
methodInfo.Invoke(call, new object[] { callback });
}
}
Run Code Online (Sandbox Code Playgroud)