Moq индексированное свойство и использовать значение индекса в возврате / обратном вызове

Я хочу moq свойство, которое имеет индекс, и я хочу иметь возможность использовать значения индекса в обратном вызове, так же, как вы можете использовать аргументы метода в обратном вызове для методов moq'd. Вероятно, это проще всего продемонстрировать на примере:

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? 

Изменить: чтобы уточнить, я хочу метод обратного вызова / возврата дляget бытьFunc<int,int>и метод обратного вызова / возврата дляset бытьAction<int,int>, Пытаясь, что предложил Майк, вы можете сделать это дляset, но с одним основным ограничением:

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

Обратный звонокDoSet действительно тогда вызывается со значениями(23,<any>), К сожалению, используяIt.IsAny<int>() вместо23 кажется, ведет себя как0, скорее, чем<any>.

Кроме того, я не мог найти способ позвонитьSetupGet сReturns гдеReturns занимаетFunc<int,int> это было бы даже скомпилировать.

Можно ли использовать Moq для этого?

Мотивация: Я просто играю с Moq, пытаясь использовать его для обеспечения свободного API для выполнения перехвата. То есть, учитывая интерфейсI и экземплярX изIавтоматически создатьMock<I> прокси с поведением по умолчаниюX.

Возможно, имело бы больше смысла работать напрямую с Castle DP, но мне нравится синтаксис Moq Expression Tree.

Ответы на вопрос(2)

Ваш ответ на вопрос