2012-07-03 8 views
27

Chcę, aby próbna zwraca 0 po raz pierwszy, a następnie zwraca 1 w dowolnym momencie metoda została wywołana. Problem polega na tym, że jeśli metoda nazywa się 4 razy, powinienem napisać:SetupSequence w Moq

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

w przeciwnym razie metoda zwróci wartość null.

Czy istnieje sposób, aby napisać, że przy następnym wywołaniu metody po raz pierwszy metoda zwraca 1? Dziękujemy

Czy dobrze mieć więcej "operatorów" dla SetupSequence? Jeśli uważasz, że tak można głosować: http://moq.uservoice.com/forums/11304-general/suggestions/2973521-setupsequence-more-operators

Odpowiedz

32

to nie jest szczególnie wyszukany, ale myślę, że to działa:

var firstTime = true; 

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

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

Ok, próbuję dziękuję – Florian

+0

działa dobrze! Dziękuję Ci ! – Florian

3

Można użyć zmiennej tymczasowej, aby śledzić, ile razy metoda nazwano .

Przykład:

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

najczystszy sposób jest stworzenie Queue i przekazać .Dequeue metoda Returns

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

+4

Nie obsługuje "nieskończonych" kolejnych wywołań ... –

+0

@RomainVerdier - Nie, nie ma. Uważam, że PO prosi o rozwiązanie z 4 inwokacjami. –

+3

Wszystko - unikaj mojego początkowego błędu. Jeśli zdefiniujesz to tak, że masz Returns (myQueue.Dequeue()), otrzymasz tylko pierwszy wynik z powrotem - ponieważ faktycznie zdeklasowałeś wynik, zamiast dostarczać wyrażenie lambda. – sfuqua

1

Wystarczy skonfigurować metodę rozszerzenia jak:

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

ZA nd następnie skonfigurować powrót jak:

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