miércoles, 18 de junio de 2008

Restricciones sobre parámetros objetos con Rhino Mocks

Restricciones sobre parámetros objetos con Rhino Mocks

Entre las restricciones que nombré en el post anterior se encuentra Property, la misma posee algunos métodos estáticos que nos permiten colocar restricciones a los parámetros de nuestros métodos "moquedos" en caso que sean tipos de referencia (objetos) y quisieramos verificar una condición para una de sus propiedades. Por ejemplo que quisieramos que la propiedad "nombre" del objeto "persona" que es parámetro del método "GuardarPersona" en una clase "moqueada" sea exáctamente "Leonardo" o contenga el texto "Lalo Landa", o incluso que contenga otras restriccions formadas por las otras clases para restricción como Is, Text, etc. vamos diréctamente al código para ver su utilización:

[TestClass]
public class RhinoMocksPropertyConstraint
{
    /// <summary>
    /// Property.Value("nombrePropiedad", "valor")
    /// quiere decir que el valor de la propiedad nombrePropiedad debe
    /// ser valor cuando se utiliza como parámetro de un método "moquedo"
    /// </summary>
    [TestMethod]
    [ExpectedException(typeof(ExpectationViolationException))]
    public void PropertyValueConstraint()
    {
        MockRepository mocker = new MockRepository();

        IProcessor mockProcessor = mocker.CreateMock<IProcessor>();

        using (mocker.Record())
        {
            //le decimos al Rhino que la llamada al método debe hacerce
            //con un objeto ClaseParametro cuya propiedad ValorTexto
            //debe tener valor "HOLA"
            Expect.Call(
                mockProcessor.TestMethod(null))
                .IgnoreArguments()
                .Return("")
                .Constraints(Property.Value("ValorTexto", "HOLA"))
                .Repeat.Any();
        }
        //Este assert es correcto, el valor de la propiedad ValorTexto es HOLA
        Assert.IsTrue(mockProcessor.TestMethod(new ClaseParametro(0, "HOLA")).Length == 0);

        //Lanza una ExpectationViolationExpcetion porque el valor de la propiedad
        //ValorTexto no es "HOLA"
        Assert.IsTrue(mockProcessor.TestMethod(new ClaseParametro(0, "CHAU")).Length == 0);

        mocker.VerifyAll();
    }
    
    /// <summary>
    /// PropertyValueConstraint permite poner cualquier tipo de constraint
    /// en una propiedad de un objeto que es parámetro de un método "moquedo"
    /// </summary>
    [TestMethod]
    [ExpectedException(typeof(ExpectationViolationException))]
    public void PropertyConstraintValueConstraint()
    {
        MockRepository mocker = new MockRepository();

        IProcessor mockProcessor = mocker.CreateMock<IProcessor>();

        using (mocker.Record())
        {
            //le decimos al Rhino que la llamada al método debe hacerce
            //con un objeto ClaseParametro cuya propiedad ValorTexto
            //debe tener contener en su valor ek texto "HOLA"
            Expect.Call(
                mockProcessor.TestMethod(null))
                .IgnoreArguments()
                .Return("")
                .Constraints(Property.ValueConstraint("ValorTexto", Text.Contains("HOLA")))
                .Repeat.Any();
        }
        //Este assert es correcto, el valor de la propiedad ValorTexto contiene la palabra HOLA
        Assert.IsTrue(mockProcessor.TestMethod(new ClaseParametro(0, "HOLA MUNDO")).Length == 0);

        //Lanza una ExpectationViolationExpcetion porque el valor de la propiedad
        //ValorTexto no contiene "HOLA"
        Assert.IsTrue(mockProcessor.TestMethod(new ClaseParametro(0, "CHAU")).Length == 0);

        mocker.VerifyAll();
    }

    /// <summary>
    /// IsNull, el objeto parámetro del método "moquedo" deber ser null
    /// </summary>
    [TestMethod]
    [ExpectedException(typeof(ExpectationViolationException))]
    public void PropertyConstraintIsNullConstraint()
    {
        MockRepository mocker = new MockRepository();

        IProcessor mockProcessor = mocker.CreateMock<IProcessor>();

        using (mocker.Record())
        {
            //le decimos al Rhino que la llamada al método debe hacerce
            //con un parámetro null
            Expect.Call(
                mockProcessor.TestMethod(null))
                .IgnoreArguments()
                .Return("")
                .Constraints(Property.IsNull("ValorTexto"))
                .Repeat.Any();
        }
        //Este assert es correcto, el parámetro es null
        Assert.IsTrue(mockProcessor.TestMethod(new ClaseParametro(0,null)).Length==0);

        //Lanza una ExpectationViolationExpcetion porque el valor de la propiedad
        //no es null
        Assert.IsTrue(mockProcessor.TestMethod(new ClaseParametro(0, "")).Length == 0);

        mocker.VerifyAll();
    }
}



public interface IProcessor
{
    string TestMethod(ClaseParametro parametro);
}

public class ClaseParametro
{
    private int _valorEntero;
    private string _valorTexto;

    public ClaseParametro(int valorEntero, string valorTexto)
    {
        this.ValorEntero = valorEntero;
        this.ValorTexto = valorTexto;
    }

    public string ValorTexto
    {
        get { return _valorTexto; }
        set { _valorTexto = value; }
    }


    public int ValorEntero
    {
        get { return _valorEntero; }
        set { _valorEntero = value; }
    }

}

Simple, hay algunos métodos más en esta clase pero creo que no vale la pena explicarlos ya que son muy intuítivos, saludos.

1 comentario:

CodingFather dijo...
Este comentario ha sido eliminado por un administrador del blog.