Moq是一个索引属性,并使用返回/回调中的索引值

Rob*_*Rob 7 c# moq indexed-properties

我想要moq一个具有索引的属性,并且我希望能够在回调中使用索引值,就像在moq方法的回调中使用方法参数一样.可能最容易用一个例子演示:

public interface IToMoq
{
    int Add(int x, int y);
    int this[int x] { get; set; }
}

    Action<int, int> DoSet = (int x, int y) =>
    {
        Console.WriteLine("setting this[{0}] = {1}", x, y);
        throw new Exception("Do I ever get called?"); 
    };
    var mock = new Mock<IToMoq>(MockBehavior.Strict);

    //This works perfectly
    mock.Setup(m => m.Add(It.IsAny<int>(), It.IsAny<int>()))
        .Returns<int, int>((a, b) => a + b);

    //This compiles, but my callback never seems to be called
    mock.SetupSet(m => m[It.IsAny<int>()] = It.IsAny<int>())
        .Callback(DoSet);

    var obj = mock.Object;
    Console.WriteLine("Add(3,4) => {0}", obj.Add(3, 4));  //Works perfectly
    obj[1] = 2;   //Does not throw, why? 
Run Code Online (Sandbox Code Playgroud)

编辑:为了澄清,我想为回调/收益的方法getFunc<int,int>,并为回调/回报的方法setAction<int,int>.尝试迈克建议的,你可以这样做set,但有一个主要的限制:

mock.SetupSet(m => m[23] = It.IsAny<int>())
            .Callback(DoSet).Verifiable();
Run Code Online (Sandbox Code Playgroud)

DoSet然后确实使用值调用回调(23,<any>).不幸的是,使用It.IsAny<int>()而不是23似乎表现为0,而不是<any>.

另外,我找不到打电话的方式SetupGetReturns在那里Returns花费Func<int,int>,即使将编译.

是否可以使用Moq?

动机:我只是在玩Moq,试图用它来提供一个流畅的API来执行拦截.也就是说,给定一个接口I和一个实例XI,自动创建一个Mock<I>与违约行为给代理X.

直接使用Castle DP可能更有意义,但我喜欢Moq Expression Tree语法.

Jep*_*sen 1

该方法SetupSet采用普通委托,而不是像许多其他 Moq 方法那样的类型的表达式树Expression<...>

因此,Moq 无法看到您使用了It.IsAny. 相反,It.IsAny调用(不是我们想要的),Moq 只能看到它的返回值恰好是default(int), 或0