Método Mock Mock sin especificar el parámetro de entrada

133

Tengo un código en una prueba usando Moq:

public class Invoice
{
    ...

    public bool IsInFinancialYear(FinancialYearLookup financialYearLookup)
    {
        return InvoiceDate >= financialYearLookup.StartDate && InvoiceDate <= financialYearLookup.EndDate;
    }
    ...
}

Entonces, en una prueba unitaria, estoy tratando de burlarme de este método y hacer que regrese verdadero

mockInvoice.Setup(x => x.IsInFinancialYear()).Returns(true);

¿Hay alguna forma de escribir esta línea para que no tenga que especificar la entrada IsInFinancialYear? es decir. Para que no aparezca en el código cuál es el parámetro de entrada, ¿devolverá verdadero lo que se le haya pasado?

AnonyMouse
fuente

Respuestas:

227

Puede usar It.IsAny<T>()para hacer coincidir cualquier valor:

mockInvoice.Setup(x => x.IsInFinancialYear(It.IsAny<FinancialYearLookup>())).Returns(true);

Consulte la sección Argumentos coincidentes del inicio rápido.

Jeff Ogata
fuente
55
Me doy cuenta de que esta respuesta es antigua, pero ¿qué pasa si tengo más de un parámetro simple? ¿Es posible decir simplemente "Cualquier cosa donde los tipos se ajusten a todos los parámetros"?
Brandon
66
@Brandon Entonces tiene un It.IsAny <type> () para cada parámetro donde type es el tipo que sea ese parámetro. Si lo desea, probablemente podría escribir una función auxiliar que lo haga por reflexión.
user441521
3
De acuerdo con los otros comentarios aquí: escribir esto para cualquier método no trivial es un gran dolor.
John Hargrove
¿Alguien tiene algún ayudante que haga esto? O tiene que escribir para cada método un ayudante /
Meysam
18

Intenta usar It.IsAny<FinancialYearLookup>()para aceptar cualquier argumento:

mockInvoice.Setup(x => x.IsInFinancialYear(It.IsAny<FinancialYearLookup>())).Returns(true);
jeha
fuente