2012-07-03 26 views
27

Quiero un simulacro devuelve un 0 la primera vez, luego devuelve 1 cada vez que se llama al método. El problema es que si el método se llama 4 veces, yo debería escribir que:SetupSequence en Moq

mock.SetupSequence(x => x.GetNumber()) 
    .Returns(0) 
    .Returns(1) 
    .Returns(1) 
    .Returns(1); 

de lo contrario el método devuelve null.

¿Hay alguna manera de escribir que las próximas veces que se llamó al método después de la primera vez, el método devuelve 1? Gracias

¿Es bueno tener más "operadores" para SetupSequence? Si cree que sí se puede votar: http://moq.uservoice.com/forums/11304-general/suggestions/2973521-setupsequence-more-operators

Respuesta

32

Eso no es particularmente elegante, pero creo que funcionaría:

var firstTime = true; 

    mock.Setup(x => x.GetNumber()) 
     .Returns(()=> 
         { 
          if(!firstTime) 
           return 1; 

          firstTime = false; 
          return 0; 
         }); 
+0

Ok, estoy tratando gracias – Florian

+0

funciona bien! Gracias ! – Florian

3

Se puede utilizar una variable temporal para realizar un seguimiento de cuántas veces se llama el método .

Ejemplo:

public interface ITest 
{ Int32 GetNumber(); } 

static class Program 
{ 
    static void Main() 
    { 
     var a = new Mock<ITest>(); 

     var f = 0; 
     a.Setup(x => x.GetNumber()).Returns(() => f++ == 0 ? 0 : 1); 

     Debug.Assert(a.Object.GetNumber() == 0); 
     for (var i = 0; i<100; i++) 
      Debug.Assert(a.Object.GetNumber() == 1); 
    } 
} 
26

la manera más limpia es crear un Queue y pasar .Dequeue método para Returns

.Returns(new Queue<int>(new[] { 0, 1, 1, 1 }).Dequeue);

+4

No es compatible con llamadas subsiguientes "infinitas" ... –

+0

@RomainVerdier - No, no es así. Creo que OP pide una solución con 4 invocaciones. –

+3

Todo: evita mi error inicial. Si lo define de modo que tenga Returns (myQueue.Dequeue()), solo obtendrá el primer resultado, ya que en realidad ha dequerado el resultado, en lugar de proporcionar una expresión lambda. – sfuqua

1

configuración Sólo un método de extensión como:

public static T Denqueue<T>(this Queue<T> queue) 
{ 
    var item = queue.Dequeue(); 
    queue.Enqueue(item); 
    return item; 
} 

UN nd a continuación, configurar el retorno como:

var queue = new Queue<int>(new []{0, 1, 1, 1}); 
mock.Setup(m => m.GetNumber).Returns(queue.Denqueue);