我想moq一个有索引的属性,我希望能够在回调中使用索引值,就像你可以使用方法一样moq'd方法的回调参数。可能比较容易证明一个例子: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?
编辑:为了澄清,我想为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
和的实例I
自动创建一个Mock<I>
代理,其行为默认为X
。
直接使用Castle DP可能会更有意义,但我喜欢Moq Expression Tree语法。
看起来像一个bug给我。使用mock.SetupSet设置模拟(c => c [1] = It.IsAny())。Callback(DoSet);'按预期工作,'mock.SetupSet(c => c [It.IsAny ()] = It.IsAny ())。回调(DoSet);'MockBehavior.Strict'失败,并且不执行'MockBehavior.Loose'。 –
sloth
With'mock.SetupSet(x => x [It.IsAny()] = It.IsAny ())。回调(doSet);''和'obj [0] = 1; obj [1] = 2;'它按照零指数的预期工作。它在索引1(或其他任何事)上失败。 –
@Rob:你跑哪个版本的Moq?我其实碰到了两种不同的行为。我正在检查Moq的版本,我在两个单独的项目中运行,一个似乎工作,另一个不工作。 –