2008-09-16 8 views
2

j'ai un tableau EnumerableRhino Mocks: Comment puis-je retourner des numéros d'une séquence

int meas[] = new double[] {3, 6, 9, 12, 15, 18}; 

Sur chaque appel successif à la méthode de la maquette que je teste, je veux retourner une valeur de ce tableau.

using(_mocks.Record()) { 
    Expect.Call(mocked_class.GetValue()).Return(meas); 
} 
using(_mocks.Playback()) { 
    foreach(var i in meas) 
    Assert.AreEqual(i, mocked_class.GetValue();  
} 

Est-ce que quelqu'un a une idée de comment je peux faire cela?

Répondre

4

Il ya toujours un faux objet statique, mais cette question concerne les rhinocéros, alors je vous présente la façon dont je vais le faire. L'astuce consiste à créer une variable locale comme compteur et à l'utiliser dans votre délégué anonyme/lambda pour garder une trace de l'endroit où vous vous trouvez sur le tableau. Notez que je n'ai pas traité le cas que GetValue() est appelé plus de 6 fois.

var meas = new int[] { 3, 6, 9, 12, 15, 18 }; 
using (mocks.Record()) 
{ 
    int forMockMethod = 0; 
    SetupResult.For(mocked_class.GetValue()).Do(
     new Func<int>(() => meas[forMockMethod++]) 
     ); 
} 

using(mocks.Playback()) 
{ 
    foreach (var i in meas) 
     Assert.AreEqual(i, mocked_class.GetValue()); 
} 
0

À mon humble avis, le rendement va gérer cela. Link.

Quelque chose comme:

get_next() { 
    foreach(float x in meas) { 
    yield x; 
    } 
} 
+0

Comment cela fonctionnerait-il exactement? Je ne comprends pas, Return n'accepte pas un type de délégué. –

0

Toute raison pour laquelle vous devez avoir une maquette ici ...
Sinon, je pencherais pour une fausse classe .. beaucoup plus simple et je sais comment obtenir à fais ceci :) Je ne sais pas si les frameworks fictifs fournissent ce genre de comportement personnalisé.

+0

Principalement parce qu'un simulacre est moins de travail et parce que je veux affirmer que la méthode a été appelée un minimum de temps. Eh bien, je devrais faire ça. –

+0

:) Dans ce cas, à moins que quelqu'un d'autre publie une version plus courte de rhinocéros que je serais aller pour une fausse classe et la lisibilité FTW. – Gishu

1

Si la fonctionnalité est le GetValue() retourne chaque élément de tableau dans la succession, alors vous devriez être en mesure de mettre en place de multiples attentes, par exemple

using(_mocks.Record()) { 
    Expect.Call(mocked_class.GetValue()).Return(3); 
    Expect.Call(mocked_class.GetValue()).Return(6); 
    Expect.Call(mocked_class.GetValue()).Return(9); 
    Expect.Call(mocked_class.GetValue()).Return(12); 
    Expect.Call(mocked_class.GetValue()).Return(15); 
    Expect.Call(mocked_class.GetValue()).Return(18); 
} 
using(_mocks.Playback()) { 
    foreach(var i in meas) 
    Assert.AreEqual(i, mocked_class.GetValue();  
} 

Le dépôt simulé appliquera les attentes dans l'ordre.