Dada la siguiente interfaz:
public interface IFoo
{
bool Foo(string a, bool b = false);
}
Intentando burlarse de él usando Moq:
var mock = new Mock<IFoo>();
mock.Setup(mock => mock.Foo(It.IsAny<string>())).Returns(false);
da el siguiente error en tiempo de compilación:
Un árbol de expresión no puede contener una llamada o invocación que utilice argumentos opcionales.
Encontré el problema mencionado anteriormente como una mejora en la lista de problemas de Moq y parece estar asignado a la versión 4.5 (siempre que sea así).
Mi pregunta es: ¿qué debo hacer dado que lo anterior no se solucionará pronto? ¿Son mis opciones solo establecer explícitamente el valor predeterminado del parámetro opcional cada vez que me burlo de él (lo que anula el punto de especificar uno en primer lugar) o crear una sobrecarga sin el bool (como lo que habría hecho? antes de C # 4)?
¿O alguien ha encontrado una forma más inteligente de superar este problema?
fuente
Respuestas:
Creo que su única opción en este momento es incluir explícitamente el
bool
parámetro en la configuración deFoo
.No creo que anule el propósito de especificar un valor predeterminado. El valor predeterminado es una conveniencia para llamar al código, pero creo que debe ser explícito en sus pruebas. Supongamos que podría omitir la especificación del
bool
parámetro. ¿Qué sucede si, en el futuro, alguien cambia el valor predeterminado deb
atrue
? Esto conducirá a pruebas fallidas (y con razón), pero serán más difíciles de solucionar debido a la suposición oculta queb
esfalse
. La especificación explícita delbool
parámetro tiene otro beneficio: mejora la legibilidad de sus pruebas. Alguien que los revise sabrá rápidamente que hay unaFoo
función que acepta dos parámetros. Esos son mis 2 centavos, al menos :)En cuanto a especificarlo cada vez que lo simula, no duplique el código: cree y / o inicialice el simulacro en una función, para que solo tenga un único punto de cambio. Si realmente lo desea, puede superar el aparente defecto de Moq aquí duplicando
Foo
los parámetros en esta función de inicialización:fuente
if (!x) {} else {}
anti-patrón :)Acabo de encontrar este problema hoy, Moq no admite este caso de uso. Entonces, parece que anular el método sería suficiente para este caso.
Ahora ambos métodos están disponibles y este ejemplo funcionaría:
fuente
Usando Moq versión 4.10.1, he podido hacer lo siguiente
Con interfaz:
Y burlarse
Resuelve una llamada a Foo con el primer parámetro bien
fuente