c# - verifiable - ¿Por qué usar It.is<> o It.IsAny<> si pudiera definir una variable?
verify moq (2)
Si nos fijamos en la documentación de inicio rápido para Moq
Argumentos coincidentes
// any value
mock.Setup(foo => foo.DoSomething(It.IsAny<string>())).Returns(true);
// matching Func<int>, lazy evaluated
mock.Setup(foo => foo.Add(It.Is<int>(i => i % 2 == 0))).Returns(true);
// matching ranges
mock.Setup(foo => foo.Add(It.IsInRange<int>(0, 10, Range.Inclusive))).Returns(true);
// matching regex
mock.Setup(x => x.DoSomething(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");
Hola, he estado usando moq por un tiempo cuando veo este código.
Tengo que configurar una devolución en uno de mis repositorios.
mockIRole.Setup(r => r.GetSomething(It.IsAny<Guid>(), It.IsAny<Guid>(),
It.IsAny<Guid>())).Returns(ReturnSomething);
Tengo tres parámetros y los vi en uno de los artículos o blogs de la red.
¿Cuál es el uso de It.Is <> o It.IsAny <> para un objeto? si pudiera usar Guid.NewGuid () u otros tipos, ¿por qué usar It.Is?
Lo siento, no estoy seguro de si mi pregunta es correcta o me falta algo de conocimiento en las pruebas. Pero parece que no hay nada malo en ambos sentidos.
Usando It.IsAny<>
, It.Is<>
, o una variable, todos tienen propósitos diferentes. Proporcionan formas cada vez más específicas de hacer coincidir un parámetro al configurar o verificar un método.
It.IsAny
La configuración del método con It.IsAny<>
coincidirá con cualquier parámetro que le des al método. Entonces, en su ejemplo, las siguientes invocaciones devolverían la misma cosa ( ReturnSomething
):
role.GetSomething(Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid());
Guid sameGuid = Guid.NewGuid();
role.GetSomething(sameGuid, sameGuid, sameGuid);
role.GetSomething(Guid.Empty, Guid.NewGuid(), sameGuid);
No importa el valor real de la Guid
que fue aprobada.
Es
La construcción It.Is<>
es útil para la configuración o verificación de un método, lo que le permite especificar una función que coincidirá con el argumento. Por ejemplo:
Guid expectedGuid = ...
mockIRole.Setup(r => r.GetSomething(
It.Is<Guid>(g => g.ToString().StartsWith("4")),
It.Is<Guid>(g => g != Guid.Empty),
It.Is<Guid>(g => g == expectedGuid)))
.Returns(ReturnSomething);
Esto le permite restringir el valor más que cualquier valor, pero le permite ser indulgente con lo que acepta.
Definiendo una Variable
Cuando configura (o verifica) un parámetro de método con una variable, está diciendo que quiere exactamente ese valor. Un método llamado con otro valor nunca coincidirá con su configuración / verificación.
Guid expectedGuids = new [] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid() };
mockIRole.Setup(r => r.GetSomething(expectedGuids[0], expectedGuids[1], expectedGuids[2]))
.Returns(ReturnSomething);
Ahora hay exactamente un caso en el que GetSomething
devolverá ReturnSomething
: cuando todos los Guid
coincidan con los valores esperados con los que lo configuraste.