2011-11-01 7 views
28

Estoy desarrollando pruebas para una aplicación. Hay un método que tiene una matriz params como parámetro. Configuré el método usando Moq, pero cuando ejecuto la prueba, el valor de retorno del método es nulo, lo que significa que no se está burlando.Método de instalación con Params Array

Aquí está un ejemplo de código:

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; 
    } 
} 

El ejercicio práctico se ve así:

var mock = new Mock<ITicketManager>(); 

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

    return null; 
}); 

Por qué nunca golpea el método burlado?

Respuesta

50

Está intentando llamar a un método que toma una sola cadena, en lugar de una matriz. Tenga en cuenta que es el compilador de C# el que maneja la parte params, convirtiendo el código de llamada que solo especifica los valores individuales en una llamada que pasa en una matriz. En lo que respecta al método en sí, es solo obtener una matriz, y eso es de lo que te estás burlando.

El compilador es en realidad convirtiendo el código en:

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

que no es lo que desea.

que puedes usar:

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

Si es necesario verificar que sólo se da un valor único, que necesita para hacer que de la misma manera que lo haría para un parámetro no params.

Básicamente, params solo hace una diferencia en el compilador de C# - no en moq.

+0

@DiegoAC: Bueno lo tienes * * Volviendo condicionalmente 'null' de todos modos. ¿Has intentado hacer que vuelva "Foo" en su lugar si 'p' no contiene' "A" '? De esa forma, al menos verías que se invoca ... –

+0

Excelente respuesta Jon. Gracias. En realidad, recibía solo una cadena. La explicación sobre el compilador fue muy útil. –

9

creo que el params string tiene que ir acompañada de It.IsAny<string[]>() en lugar de It.IsAny<string>()

Cuestiones relacionadas