Moq una propiedad indexada y use el valor de índice en la devolución / devolución de llamada

Quiero moq una propiedad que tiene un índice, y quiero poder usar los valores de índice en la devolución de llamada, de la misma manera que puede usar argumentos de método en la devolución de llamada para métodos moq'd. Probablemente más fácil de demostrar con un ejemplo:

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? 

Editar: para aclarar, quiero el método de devolución de llamada / devoluciones para elget serFunc<int,int>, y el método de devolución de llamada / devoluciones paraset serAction<int,int>. Intentando lo que Mike sugirió, puedes hacer esto porset, pero con una limitación importante:

mock.SetupSet(m => m[23] = It.IsAny<int>())
            .Callback(DoSet).Verifiable();

La devolución de llamadaDoSet de hecho se llama con valores(23,<any>). Desafortunadamente, usandoIt.IsAny<int>() en lugar de23 parece comportarse como0, más bien que<any>.

Además, no pude encontrar una forma de llamarSetupGet conReturns dóndeReturns toma unaFunc<int,int> eso incluso compilaría.

¿Es posible usar Moq para esto?

Motivación: Solo estoy jugando con Moq, intentando usarlo para proporcionar una API fluida para realizar intercepciones. Es decir, dada una interfazI y una instanciaX deI, crea automáticamente unMock<I> proxy con comportamiento predeterminadoX.

Probablemente tendría más sentido trabajar directamente con Castle DP, pero me gusta la sintaxis de Moq Expression Tree.

Respuestas a la pregunta(2)

Su respuesta a la pregunta