Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
Unit testing 将数组传递给模拟方法调用的能力_Unit Testing_Mocking_Rhino Mocks_Moq - Fatal编程技术网

Unit testing 将数组传递给模拟方法调用的能力

Unit testing 将数组传递给模拟方法调用的能力,unit-testing,mocking,rhino-mocks,moq,Unit Testing,Mocking,Rhino Mocks,Moq,我有一个我想要模拟的方法,它将数组作为参数。在实际调用中,该方法将修改该数组,生成的数组将在代码中进一步使用。 我试图做的是将数组传递给mock方法调用,该方法调用的值在再次使用数组时是有效的。然而,我发现当调用mock方法时,它没有使用我在设置mock时指定的数组,而是使用原始数组,是否有办法解决这个问题 e、 g 公共接口测试 { int Do(int[]值); } 公开无效测试 { var testMock=new Mock(); int[]returnArray=newint[]{1,2

我有一个我想要模拟的方法,它将数组作为参数。在实际调用中,该方法将修改该数组,生成的数组将在代码中进一步使用。 我试图做的是将数组传递给mock方法调用,该方法调用的值在再次使用数组时是有效的。然而,我发现当调用mock方法时,它没有使用我在设置mock时指定的数组,而是使用原始数组,是否有办法解决这个问题

e、 g

公共接口测试
{
int Do(int[]值);
}
公开无效测试
{
var testMock=new Mock();
int[]returnArray=newint[]{1,2,3};
Setup(x=>x.Do(returnArray)).Returns(0);
MyTestObject obj=新的MyTestObject();
TestFunction(testMock.Object);
}
公共类MyTestObject
{
.....
公共void测试函数(ITest值)
{
int[]数组=新的int[3];
value.Do(数组);
if(数组[0]==1)
这就是我的测试失败的地方,因为数组仍然是上面两行声明的空数组,而不是我在mocked方法调用中指定的数组。希望这能解释我试图实现的目标,如果是这样的话,还有什么方法可以实现。如果可以这样做的话,也可以使用rhinomock

提前感谢,


Kev

您在这里所做的唯一一件事就是设置一个期望,即您的Do方法将以returnArray作为参数被调用,并且它将返回0作为结果。您要做的是

  • 创建一个严格的模拟,以便更好地查看执行的内容
  • 设置需要初始数组的调用,然后运行委托将值设置为1、2、3
  • 使用Rhino Mock,看起来是这样的(使用moq,它将是等效的):

    私有委托intdodelegate(int[]值);
    [测试]
    公共无效MyTest()
    {
    var testMock=MockRepository.GenerateStrictMock();
    Expect(x=>x.Do(null))
    .IgnoreArguments()
    .Do(新的DoDelegate(委托)(int[]值)
    {
    数值[0]=1;
    数值[1]=2;
    数值[2]=3;
    返回0;
    }));
    //执行(显然,在这里使用真实对象
    int[]数组=新的int[3];
    Do(数组);
    AreEqual(1,数组[0]);
    }
    
    干杯,伙计,为我干杯。再次感谢你,凯文
    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) 
    
    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]);
    }