使用Moq的多个索引器

时间:2011-10-24 15:21:36

标签: c# unit-testing moq

我一直在尝试使用Moq伪造一个具有多个索引器的对象集(和get)。我以前一直使用Moq与单个索引器相当一段时间,但它似乎没有使用多个索引器。我从研究中了解到Moq使用It.IsAny<>可能会出现问题。对于索引器参数,但我也尝试了以下代码和特定参数(如mock [1,“BlockItem”])这是我的代码:

m_storageAccessor.SetupSet(
mock => mock[It.IsAny<int>(), It.IsAny<string>()] = It.IsAny<object>()).Callback(
                (int i, string s, object o) =>
                       {
                           m_storageAccessor.SetupGet(
                               mock => mock[i, s]).Returns(
                                   () => { return o; });
                       });

再次生成以下异常,无论我在SetupSet()中给出索引器函数的参数是什么。

  

初始化方法UnitTest.BonusHandlerTest.MyTestInitialize抛出   例外。 System.ArgumentNullException:   System.ArgumentNullException:值不能为null。参数名称:   参数。

     

System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodInfo的   方法,ReadOnlyCollection 1& arguments) System.Linq.Expressions.Expression.ValidateCallArgs(Expression instance, MethodInfo method, ReadOnlyCollection 1&amp;参数)   System.Linq.Expressions.Expression.Call(表达式实例,   MethodInfo方法,IEnumerable 1 arguments) System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, Expression[] arguments) TCall](Mock 1 mock,   行动1 setterExpression, Func 5 callFactory)b__25()   Moq.PexProtector.Invoke [T](Func 1 function) Moq.Mock.SetupSet[T](Mock 1 mock,Action 1 setterExpression, Func 1   condition)SetupSet(Action`1 setterExpression)   UnitTest.BonusHandlerTest.SetupPersistence()in   C:\ Perforce公司\ dev的\ KHIRST_Client12.BonusHandler \ Client12 \游戏\ BonusHandler \单元测试\ BonusHandlerTest.cs:   第868行UnitTest.BonusHandlerTest.MyTestInitialize()in   C:\ Perforce公司\ dev的\ KHIRST_Client12.BonusHandler \ Client12 \游戏\ BonusHandler \单元测试\ BonusHandlerTest.cs:   第100行

根据我的尝试,似乎Moq无法使用多个参数进行索引。有人有主意吗?互联网没有多大帮助。

1 个答案:

答案 0 :(得分:2)

为了它的价值,我设置了这个场景,没有例外:

        var myStub = new Mock<Foo>();
        myStub.SetupSet(foo => foo[12, "asdf"] = null).Callback((int i, string s, object o) => myStub.SetupGet(foo => foo[i, s]).Returns(o));

它似乎不仅仅是喜欢It.IsAny&lt;&gt;对于索引器的参数,还要设置值。我在测试中从未尝试过这样做,但这对我来说似乎是当前的工具限制。