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)
编辑:为了澄清,我想为回调/收益的方法get是Func<int,int>,并为回调/回报的方法set是Action<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>.
另外,我找不到打电话的方式SetupGet与Returns在那里Returns花费Func<int,int>,即使将编译.
是否可以使用Moq?
动机:我只是在玩Moq,试图用它来提供一个流畅的API来执行拦截.也就是说,给定一个接口I和一个实例X中I,自动创建一个Mock<I>与违约行为给代理X.
直接使用Castle DP可能更有意义,但我喜欢Moq Expression Tree语法.
该方法SetupSet采用普通委托,而不是像许多其他 Moq 方法那样的类型的表达式树Expression<...>。
因此,Moq 无法看到您使用了It.IsAny. 相反,It.IsAny被调用(不是我们想要的),Moq 只能看到它的返回值恰好是default(int), 或0。