Возможность передать массив в вызов метода - PullRequest
3 голосов
/ 18 февраля 2010

У меня есть метод, который я хочу макет, который принимает массив в качестве аргумента. При реальном вызове метод изменяет этот массив, и результирующий массив будет использоваться далее в коде. То, что я пытался сделать, это передать массив в вызов mocked-метода, который имел значения, которые были бы действительны при повторном использовании массива. Однако, что я нахожу, так это то, что когда выполняется вызов для смоделированного метода, он не использует массив, указанный мной при настройке макета, вместо использования исходного массива. Есть ли способ обойти эту проблему.

* 1003 например *

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) 

Здесь мой тест падает, так как массив по-прежнему является нулевым массивом, объявленным двумя строками выше, а не массивом, который я указал в вызове mocked-метода. Надеюсь, что это объясняет, чего я пытаюсь достичь, и если да, то есть ли в любом случае это сделать. Также был бы открыт для использования RhinoMocks, если бы это можно было сделать таким образом.

Спасибо заранее,

Кев

1 Ответ

1 голос
/ 18 февраля 2010

Единственное, что вы здесь сделали, - это установили ожидание, что ваш метод Do будет вызываться с returnArray в качестве параметра и что он вернет 0 в качестве результата. Что вы хотите сделать, это

  1. создать строгий макет, чтобы лучше видеть, что выполняется
  2. установить вызов, который ожидает ваш начальный массив, а затем запустить делегат, чтобы установить значения 1, 2, 3

при использовании 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]);
}
...