Moq: especificar valores de retorno como parte de las expectativas

StackOverflow https://stackoverflow.com/questions/1436757

  •  08-07-2019
  •  | 
  •  

Pregunta

Soy nuevo en Moq y estoy aprendiendo.

Necesito probar que un método devuelve el valor esperado. He preparado un ejemplo de asentimiento 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.

¿Fue útil?

Solución

  1. Necesita un sujeto de prueba que interactúe con objetos simulados (a menos que esté escribiendo una prueba de aprendizaje para Moq.) Escribí uno simple a continuación
  2. Configura las expectativas en el objeto simulado, especificando los argumentos exactos (estricto, si lo desea, utilice Is.Any<string> para aceptar cualquier cadena) y especifique los valores de retorno si los hay
  3. Su sujeto de prueba (como parte del paso Actuar de la prueba) recurrirá a su simulación
  4. Usted afirma que el sujeto de prueba se comportó como se requiere. El sujeto de prueba utilizará el valor de retorno de los métodos simulados; 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, se llamaron 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);
  }
}

Otros consejos

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

De hecho, hay ninguna sobrecarga de Verificar que devuelve algo , porque nunca debería necesitar verificar que un método simulado devuelve 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ó un valor que esperaba. Los valores de retorno de los métodos y propiedades simulados no son importantes cuando llega a & Quot; afirmar & Quot; fase de su prueba.

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

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

Observe más de cerca la prueba de Gishu o la prueba que propuse en la pregunta SO vinculada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top