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.