2011-11-01 10 views
28

Opracowuję testy dla aplikacji. Istnieje metoda, która ma tablicę params jako parametr. Ustawiłem metodę za pomocą Moq, ale kiedy uruchomię test, zwracana wartość metody jest zerowa, co oznacza, że ​​nie jest ona kpiną.Metoda instalacji z parametrami Array

Oto przykładowy kod:

public interface ITicketManager { 
    string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch); 
} 

public class TicketManager : ITicketManager { 
    private Queue<string> ticketQueue = new Queue<string>(); 

    public string GetFirstTicketInQueueIfMatches(params string[] ticketsToMatch) { 
     var firstQueuedTicket = ticketQueue.Peek(); 
     var firstQueuedTicketMatchesAnyOfRequested = ticketsToMatch.Any(t => t == firstQueuedTicket); 

     if(firstQueuedTicketMatchesAnyOfRequested) 
      return firstQueuedTicket; 

     return null; 
    } 
} 

Kod mock wygląda następująco:

var mock = new Mock<ITicketManager>(); 

mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string>())) 
    .Returns(p => { 
    if(p.Contains("A")) 
      return "A"; 

    return null; 
}); 

Dlaczego nigdy nie uderza szydzili metody?

Odpowiedz

50

Próbujesz wywołać metodę pobierającą pojedynczy ciąg, a nie tablicę. Należy pamiętać, że jest to kompilator C#, który obsługuje część params, konwertując kod wywołujący, który właśnie określa poszczególne wartości na połączenie przechodzące w tablicy. Jeśli chodzi o samą metodę, to po prostu dostaniesz tablicę - i to właśnie kpisz.

Kompilator jest faktycznie obracając swój kod do:

mock.Setup(m => m.GetFirstTicketInQueueIfMatches 
         (new string[] { It.IsAny<string>() })) 

który nie jest to, co chcesz.

Należy użyć:

mock.Setup(m => m.GetFirstTicketInQueueIfMatches(It.IsAny<string[]>())) 

Jeśli chcesz sprawdzić, czy to tylko zostanie podana jedną wartość, trzeba to zrobić w taki sam sposób, jak dla parametru non-params.

Zasadniczo params ma tylko wpływ na kompilator C# - nie na moq.

+0

@DiegoAC: Cóż masz to warunkowo * * zawracania 'null' tak. Czy próbowałeś, aby zamiast tego zwrócił "Foo", jeśli 'p' nie zawiera' "A"? W ten sposób przynajmniej zobaczysz, że jest on wywoływany ... –

+0

Doskonała odpowiedź Jon. Dzięki. Właściwie otrzymywałem tylko jeden ciąg znaków. Objaśnienie dotyczące kompilatora było bardzo przydatne. –

9

wierzę params string musi być dopasowana przez It.IsAny<string[]>() zamiast It.IsAny<string>()