我一直在尝试使用 Moq 来伪造具有多个索引器的对象集(并获取)。我以前使用带有单个索引器的 Moq 已经有一段时间了,但它似乎无法使用多个索引器。我从我的研究中了解到,使用 It.IsAny<> 作为索引器参数时,Moq 可能会出现问题,但我也尝试了以下带有特定参数的代码(如 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() 中为索引器函数提供什么参数,这都会再次产生以下异常。
Initialization method UnitTest.BonusHandlerTest.MyTestInitialize threw exception. System.ArgumentNullException: System.ArgumentNullException: Value cannot be null. Parameter name: arguments.
System.Linq.Expressions.Expression.ValidateArgumentTypes(MethodInfo method, ReadOnlyCollection
1& arguments) System.Linq.Expressions.Expression.ValidateCallArgs(Expression instance, MethodInfo method, ReadOnlyCollection
1& arguments) System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, IEnumerable1 arguments) System.Linq.Expressions.Expression.Call(Expression instance, MethodInfo method, Expression[] arguments) TCall](Mock
1 mock, Action1 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\Gaming\BonusHandler\UnitTest\BonusHandlerTest.cs: line 868 UnitTest.BonusHandlerTest.MyTestInitialize() in C:\perforce\dev\KHIRST_Client12.BonusHandler\Client12\Gaming\BonusHandler\UnitTest\BonusHandlerTest.cs: line 100
根据我的尝试,Moq 似乎无法使用多个参数创建索引器。有人有主意吗?互联网并没有太大帮助。
最佳答案
为了它的值(value),我设置了这个场景并且没有异常(exception):
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<> 那样用于索引器的参数,而且还用于设置值。我从未在测试中尝试这样做,但这似乎是该工具目前对我的限制。
关于c# - 在 Moq 中使用多个索引器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7877945/