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.