我有一个我想要模拟的方法,它将数组作为参数。在实际调用中,该方法将修改此数组,并且结果数组将在代码中进一步使用。 我试图做的是将数组传递给模拟方法调用,该方法调用具有在再次使用数组时有效的值。然而,我发现当调用模拟方法时,它不使用我在设置模拟时指定的数组,而是使用原始数组,是否有解决此问题的方法。
e.g
public interface ITest
{
int Do(int[] values);
}
public void MyTest
{
var testMock = new Mock<ITest>();
int[] returnArray = new int[] {1,2,3};
testMock.Setup(x => x.Do(returnArray)).Returns(0);
MyTestObject obj = new MyTestObject();
obj.TestFunction(testMock.Object);
}
public class MyTestObject
{
.....
public void TestFunction(ITest value)
{
int [] array = new int[3];
value.Do(array);
if (array[0] == 1)
这是我的测试失败的地方,因为数组仍然是声明上面两行的空数组,而不是我在模拟方法调用中指定的数组。希望这能解释我想要实现的目标,如果有的话,无论如何都要这样做。如果可以这样做的话,也可以使用RhinoMocks。
提前感谢,
Kev
答案 0 :(得分:1)
这里你唯一要做的就是设置一个期望,你的Do方法将以returnArray作为参数调用,并且它将返回0作为结果。你想做的是
使用Rhino Mock这看起来像这样(使用moq它将是等效的):
private delegate int DoDelegate(int[] values);
[Test]
public void MyTest()
{
var testMock = MockRepository.GenerateStrictMock<ITest>();
testMock.Expect(x => x.Do(null))
.IgnoreArguments()
.Do(new DoDelegate(delegate(int[] values)
{
values[0] = 1;
values[1] = 2;
values[2] = 3;
return 0;
}));
//Execution (use your real object here obviously
int[] array = new int[3];
testMock.Do(array);
Assert.AreEqual(1, array[0]);
}