setup quantity meaning ejemplos como calcular moq

quantity - Moq: Especificar valores de retorno como parte de las expectativas.



moq setup (3)

  1. Necesita un sujeto de prueba que interactúe con objetos simulados (a menos que esté escribiendo una prueba de aprendizaje para Moq). A continuación, escribí una simple.
  2. Configura las expectativas en el objeto simulado, especificando los argumentos exactos (estricto - si desea por supuesto, de lo contrario, use Is.Any<string> para aceptar cualquier cadena) y especifique valores de retorno si los hay
  3. Su sujeto de prueba (como parte del paso de la ley de la prueba) llamará a su simulacro
  4. Usted afirma que el sujeto de la prueba se comportó como se requiere. El valor de retorno de los métodos simulados será utilizado por el sujeto de prueba; verifíquelo a través de la interfaz pública del sujeto de prueba.
  5. También verifica que se cumplieron todas las expectativas que especificó; de hecho, todos los métodos que esperaba que se llamaran.

.

[TestFixture] public class Can_test_a_customer { [Test] public void Can_do_something() { //arrange var customerMock = new Moq.Mock<ICustomer>(); customerMock.Setup(c => c.DoSomething( Moq.It.Is<string>(name => name == "Jo"), Moq.It.Is<string>(surname => surname == "Blog"), Moq.It.Is<int>(age => age == 1))) .Returns("OK"); //act var result = TestSubject.QueryCustomer(customerMock.Object); //assert Assert.AreEqual("OK", result, "Should have got an ''OK'' from the customer"); customerMock.VerifyAll(); } } class TestSubject { public static string QueryCustomer(ICustomer customer) { return customer.DoSomething("Jo", "Blog", 1); } }

Soy nuevo en Moq y aprendiendo.

Necesito probar que un método devuelve el valor esperado. He reunido un ejemplo de noddy para explicar mi problema. Esto falla miserablemente con:

"ArgumentException: la expresión no es una invocación de método: c => (c.DoSomething (" Jo "," Blog ", 1) =" OK ")"

¿Puedes corregir lo que estoy haciendo mal?

[TestFixtureAttribute, CategoryAttribute("Customer")] public class Can_test_a_customer { [TestAttribute] public void Can_do_something() { var customerMock = new Mock<ICustomer>(); customerMock.Setup(c => c.DoSomething("Jo", "Blog", 1)).Returns("OK"); customerMock.Verify(c => c.DoSomething("Jo", "Blog", 1)=="OK"); } } public interface ICustomer { string DoSomething(string name, string surname, int age); } public class Customer : ICustomer { public string DoSomething(string name, string surname, int age) { return "OK"; } }

En pocas palabras: si quisiera probar un método como el anterior, y sé que estoy esperando un "OK", ¿cómo lo escribiría usando Moq?

Gracias por cualquier sugerencia.


Estás haciendo lo mismo que este tipo estaba haciendo aquí: Cómo verificar que otro método en la clase se llamaba usando Moq

Te estás burlando de lo que estás probando. Esto no tiene sentido. El uso de Mocks es para aislamiento. Tu prueba Can_Do_Something siempre pasará . No importa qué. Esta no es una buena prueba.

Eche un vistazo más de cerca a la prueba de Gishu o la prueba que propuse en la pregunta SO vinculada.


Mock<T>.Verify no devuelve el valor que devolvió la llamada al método, por lo que no puede compararlo con el valor esperado usando "==".

De hecho, no hay una sobrecarga de Verify que devuelva nada, porque nunca debería necesitar verificar que un método simulado devuelva un valor específico. Después de todo, ¡ usted fue responsable de configurarlo para devolver ese valor en primer lugar! Los valores de retorno de los métodos simulados están ahí para ser utilizados por el código que está probando, no está probando los simulacros.

Use Verificar para confirmar que se llamó al método con los argumentos que esperaba, o que a una propiedad se le asignó el valor que esperaba. Los valores de retorno de los métodos y propiedades simulados no son importantes en el momento en que se llega a la fase de "evaluación" de su prueba.