Moq是一个具有5个以上参数和访问调用参数的函数

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及其所有验证等.

Ror*_*eod 16

2011年4月12日发布的Moq 4.0(4.0.10827)的最终版本支持此功能.如果您使用的是.NET 4,则最多可以模拟16个参数.


小智 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)


Rob*_*vey 3

我知道这可能会破坏您的设计,但是有这么多参数,传递参数数组不是更好吗?