Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 设置不同输入和输出的模拟对象方法,警告:访问修改的闭包_C#_Moq - Fatal编程技术网

C# 设置不同输入和输出的模拟对象方法,警告:访问修改的闭包

C# 设置不同输入和输出的模拟对象方法,警告:访问修改的闭包,c#,moq,C#,Moq,我想用一个方法设置一个模拟对象,该方法应该为每个输入返回不同的内容。当我尝试下面给出的代码时,我得到了一个关于访问修改的闭包的警告(即访问I)。如何正确设置模拟对象的foommethod(I)以返回I*3 var ret = new Mock<FooClass>(); for(var i = 0; i < 10; i++){ var bar = i*3; ret.Setup(x => x.FooMethod(i)).Returns(bar); } va

我想用一个方法设置一个模拟对象,该方法应该为每个输入返回不同的内容。当我尝试下面给出的代码时,我得到了一个关于访问修改的闭包的警告(即访问
I
)。如何正确设置模拟对象的
foommethod(I)
以返回
I*3

var ret = new Mock<FooClass>();

for(var i = 0; i < 10; i++){
    var bar = i*3;
    ret.Setup(x => x.FooMethod(i)).Returns(bar);
}
var ret=new Mock();
对于(变量i=0;i<10;i++){
var-bar=i*3;
ret.Setup(x=>x.foothod(i)).Returns(bar);
}

奥利维尔已经在评论中说过了。由于
for
变量的闭包语义,Moq在代码中看到的实际上是:

ret.Setup(x => x.FooMethod(10)).Returns(0);
ret.Setup(x => x.FooMethod(10)).Returns(3);
ret.Setup(x => x.FooMethod(10)).Returns(6);
ret.Setup(x => x.FooMethod(10)).Returns(9);
ret.Setup(x => x.FooMethod(10)).Returns(12);
ret.Setup(x => x.FooMethod(10)).Returns(15);
ret.Setup(x => x.FooMethod(10)).Returns(18);
ret.Setup(x => x.FooMethod(10)).Returns(21);
ret.Setup(x => x.FooMethod(10)).Returns(24);
ret.Setup(x => x.FooMethod(10)).Returns(27);
当然,这不是你想要的。(Moq将仅为值
10
设置,并使用最新的
设置
,因此返回
27

不要关闭(捕获)变量的
。一个解决方案是:

for (var i = 0; i < 10; i++) {
    var iCopy = i;
    ret.Setup(x => x.FooMethod(iCopy)).Returns(3 * iCopy);
}
Moq提供了另一种不需要循环的方法。是这样的:

ret.Setup(x => x.FooMethod(It.IsAny<int>())).Returns((int i) => 3 * i);

奥利维尔已经在评论中说过了。由于
for
变量的闭包语义,Moq在代码中看到的实际上是:

ret.Setup(x => x.FooMethod(10)).Returns(0);
ret.Setup(x => x.FooMethod(10)).Returns(3);
ret.Setup(x => x.FooMethod(10)).Returns(6);
ret.Setup(x => x.FooMethod(10)).Returns(9);
ret.Setup(x => x.FooMethod(10)).Returns(12);
ret.Setup(x => x.FooMethod(10)).Returns(15);
ret.Setup(x => x.FooMethod(10)).Returns(18);
ret.Setup(x => x.FooMethod(10)).Returns(21);
ret.Setup(x => x.FooMethod(10)).Returns(24);
ret.Setup(x => x.FooMethod(10)).Returns(27);
当然,这不是你想要的。(Moq将仅为值
10
设置,并使用最新的
设置
,因此返回
27

不要关闭(捕获)变量的
。一个解决方案是:

for (var i = 0; i < 10; i++) {
    var iCopy = i;
    ret.Setup(x => x.FooMethod(iCopy)).Returns(3 * iCopy);
}
Moq提供了另一种不需要循环的方法。是这样的:

ret.Setup(x => x.FooMethod(It.IsAny<int>())).Returns((int i) => 3 * i);

在调用
ret.Setup
之前,将
i
分配给循环中的另一个变量。这使得lambda在每个循环中都捕获这个局部变量。否则它将只捕获一次
i
。请参阅:。在调用
ret.Setup
之前,将
i
分配给循环中的另一个变量。这使得lambda在每个循环中都捕获这个局部变量。否则它将只捕获一次
i
。请参阅:。