我一直在尝试使用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方法,IEnumerable1 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](Func1 function) Moq.Mock.SetupSet[T](Mock
1 mock,Action1 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无法使用多个参数进行索引。有人有主意吗?互联网没有多大帮助。
答案 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;对于索引器的参数,还要设置值。我在测试中从未尝试过这样做,但这对我来说似乎是当前的工具限制。