C# 对具有不同参数的同一方法调用的Moq期望

C# 对具有不同参数的同一方法调用的Moq期望,c#,.net,unit-testing,mocking,moq,C#,.net,Unit Testing,Mocking,Moq,我试图在循环中设置一个模拟对象,该对象将为具有不同参数的函数调用返回不同的值: var myMock= new Mock<IInterface>(); for (int i = 0; i < fromKeys.Count; ++i) { var value= new[] {new[] {1.0 + i}}; _values.Add(value); myMock.Setup(x => x.Provide(fromKeys[i])).Returns(n

我试图在循环中设置一个模拟对象,该对象将为具有不同参数的函数调用返回不同的值:

var myMock= new Mock<IInterface>();
for (int i = 0; i < fromKeys.Count; ++i)
{
    var value= new[] {new[] {1.0 + i}};
    _values.Add(value);
    myMock.Setup(x => x.Provide(fromKeys[i])).Returns(new Sth(fromKeys[i], value));
}
_myObject = myMock.Object;

如何设置它?

这是一个关闭问题
x=>x.Provide(fromKeys[i])
直到稍后才会计算。稍后对其求值时,
i
=
fromKeys.Count
,超出数组的范围。如果这不合理,我建议阅读更多关于闭包的内容。不过,简单的解决方案是添加一行代码,使代码看起来像这样(在
for
循环中)

for(int i=0;ix.Provide(fromKeys[j])).Returns(newsth(fromKeys[j],_values[j]);
}

这是一个关闭问题
x=>x.Provide(fromKeys[i])
直到稍后才会计算。稍后对其求值时,
i
=
fromKeys.Count
,超出数组的范围。如果这不合理,我建议阅读更多关于闭包的内容。不过,简单的解决方案是添加一行代码,使代码看起来像这样(在
for
循环中)

for(int i=0;ix.Provide(fromKeys[j])).Returns(newsth(fromKeys[j],_values[j]);
}

这是否与关闭有关?尝试在循环中的
myMock.Setup()前面添加一行:
intj=i
然后在模拟设置中使用
j
而不是
i
。如何设置_值?看起来_值是个问题。你能提供设置_值的代码吗?@AdarshShah,值实际上是在同一个循环中创建的,请参见编辑。崩溃是在我调用模拟上的方法时发生的,而不是在我设置它时发生的。@TheMouthofaCow,请参见编辑。这与闭包有关吗?尝试在循环中的
myMock.Setup()前面添加一行:
intj=i
然后在模拟设置中使用
j
而不是
i
。如何设置_值?看起来_值是个问题。你能提供设置_值的代码吗?@AdarshShah,值实际上是在同一个循环中创建的,请参见编辑。崩溃是在我调用模拟上的方法时发生的,而不是在我设置它时发生的。@TheMouthofaCow,请参见编辑。
System.Reflection.TargetInvocationException : Exception has been thrown by the target of an invocation.
  ----> System.ArgumentOutOfRangeException : Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
   at System.RuntimeMethodHandle._InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, ref SignatureStruct sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
   at System.RuntimeMethodHandle.InvokeMethodFast(IRuntimeMethodInfo method, Object target, Object[] arguments, Signature sig, MethodAttributes methodAttributes, RuntimeType typeOwner)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
   at System.Delegate.DynamicInvokeImpl(Object[] args)
   at Moq.Evaluator.SubtreeEvaluator.Evaluate(Expression e)
   at Moq.Matchers.LazyEvalMatcher.Matches(Object value)
   at Moq.MethodCall.Matches(ICallContext call)
   at System.Linq.Enumerable.LastOrDefault(IEnumerable`1 source, Func`2 predicate)
   at Moq.ExtractProxyCall.HandleIntercept(ICallContext invocation, InterceptStrategyContext ctx)
   at Moq.Interceptor.Intercept(ICallContext invocation)
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at Castle.Proxies.IBrownianProviderProxy.Provide(BrowniansKey keys)
   at MyCode.....
for (int i = 0; i < fromKeys.Count; ++i)
{
    int j = i;
    myMock.Setup(x => x.Provide(fromKeys[j])).Returns(new Sth(fromKeys[j], _values[j]));
}