with verifiable unit tests setup objetos mock and c# unit-testing testing mocking moq

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.