2010-02-18 11 views
3

J'ai une méthode que je veux mocker qui prend un tableau comme argument. Dans un appel réel, la méthode modifierait ce tableau et le tableau résultant serait utilisé plus loin dans le code. Ce que j'ai essayé de faire était de passer dans le tableau à l'appel de méthode mocked, qui avait des valeurs qui seraient valables lorsque le tableau est utilisé à nouveau. Cependant ce que je trouve est quand l'appel est fait à la méthode mockée il n'utilise pas le tableau que j'ai spécifié lors de la mise en place du mock, à la place en utilisant le tableau original, Y at-il un moyen de contourner ce problème.Possibilité de passer un tableau à un appel de méthode mocké

par exemple

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) 

C'est là mon test tombe sous forme de tableau est toujours le tableau NULL a déclaré deux lignes ci-dessus et non le tableau i spécifié dans l'appel de méthode moqué. J'espère que cela explique ce que j'essaie d'atteindre et si oui, y a-t-il un moyen de le faire. Serait également ouvert à l'utilisation de RhinoMocks si cela pouvait être fait de cette façon.

Merci à l'avance,

Kev

Répondre

1

La seule chose que vous avez fait ici est de mettre en place une attente que votre méthode Do sera appelée avec returnArray comme paramètre, et qu'il retournera 0 comme résultat. Ce que vous voulez faire est de

  1. créer une maquette stricte pour mieux voir ce qui est en cours d'exécution
  2. configuration un appel qui attend votre tableau initial, puis exécute un délégué pour définir les valeurs 1, 2, 3

utilisant Rhino Mock cela ressemblerait à ceci (en utilisant moq il sera équivalent):

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]); 
} 
+0

Cheers mate qui a fait le travail pour moi. Merci encore, Kev – KevGwy