Pregunta

Yo escribo (intentar escribir) las pruebas unitarias para una aplicación de WPF.

Los objetos de negocio que se une la interfaz de usuario para implementar IDataErrorInfo, de tal manera que cuando me puse ValidatesOnDataErrors = True en mi la vista XAML, el indexador de error (esto []) se llama en cualquier momento la incubadora para el objeto de negocio unido se llama. Esa parte es grande.

Ahora si llamo colocador de esa misma propiedad de un unittest, nunca se llama el indexador de error. ¿Cómo fuerzo el indexador IDataErrorInfo ser evaluados desde el interior de una prueba de unidad?

sólo para ilustración, aquí es uno de mis simples indexadores de error que contiene una propiedad Name. Configuración 'myObject.Name = String.Empty;' no llamar a la incubadora, pero no el indexador de error cuando hago esto en mis pruebas de unidad.

        public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            IsDirty = true;
            OnPropertyChanged("Name");
        }
    }

        #region IDataErrorInfo

    public Dictionary<string, string> ErrorCollection;

    public string this[string property]
    {
        get
        {
            string msg = null;
            switch (property)
            {
                case "Name":
                    if (string.IsNullOrEmpty(Name))
                        msg = "ICU Name is required.";
                    else if (Name.Length < 4)
                        msg = "ICU Name must contain at least 4 characters.";
                    else if (_parent.Units.AsEnumerable().Count(u => u.Name == Name) > 1)
                        msg = Name + " already exists, please change to a different Name.";
                    break;
            }


            if (msg != null && !ErrorCollection.ContainsKey(property))
                ErrorCollection.Add(property, msg);
            if (msg == null && ErrorCollection.ContainsKey(property))
                ErrorCollection.Remove(property);

            return msg;
        }
    }

    public string Error
    {
        get { return null; }
    }
    #endregion

Gracias!

¿Fue útil?

Solución

Lo que yo haría en una unidad de prueba es establecer el valor de Name, a continuación, llamar de forma explícita el indexador para comprobar el error.

Se puede enlazar el evento PropertyChanged en la prueba de unidad, pero no creo que tiene sentido, como era entonces de alguna manera tiene que notificar el método de ensayo que se recibió el evento y luego usted tendría que llamar a la indexador de todos modos.

Otros consejos

es necesario conectar en el caso PropertyChanged ti mismo y luego, cuando el controlador se llama, llama al controlador paso a paso con el nombre de la propiedad. O no enganchar en el evento y llamar al controlador paso a paso con el nombre de la propiedad que está probando.

Eso es lo que lo hace .NET. Se llama el indexador con nombres de propiedades.

MyClass mc = new MyClass();
mc.Name = "abc";
string error = mc["Name"];

La siguiente NUnit exámenes llamada el indexador para la propiedad Nombre y validar el mensaje de error.

[TestFixture]
public class MyClassTests
{
    [TestCase("", "ICU Name is required.")]
    [TestCase("A Valid Name", null)]
    public void ValidationIcuNameIsRequired(string name, string expectedResult)
    {
        // Arrange 
        var systemUnderTest = new MyClass();

        // Act
        systemUnderTest.Name = name;

        // Assert
        Assert.AreEqual(expectedResult, systemUnderTest[nameof(systemUnderTest.Name)]);
    }

    [TestCase("a", "ICU Name must contain at least 4 characters.")]
    [TestCase("ab", "ICU Name must contain at least 4 characters.")]
    [TestCase("abc", "ICU Name must contain at least 4 characters.")]
    [TestCase("abcd", null)]
    [TestCase("abcde", null)]
    public void ValidationIcuNameLongerThanThreeCharacters(string name, string expectedResult)
    {
        // Arrange 
        var systemUnderTest = new MyClass();

        // Act
        systemUnderTest.Name = name;

        // Assert
        Assert.AreEqual(expectedResult, systemUnderTest[nameof(systemUnderTest.Name)]);
    }

    [Test]
    public void ValidationParentDoesNotExist()
    {
        // Arrange
        var systemUnderTest = new MyClass();
        string icuName = "TestName";            
        systemUnderTest.Parent.Units.Add(new Unit() {Name = icuName });

        // Act
        systemUnderTest.Name = icuName;

        // Assert
        Assert.AreEqual(icuName + " already exists, please change to a different Name.", systemUnderTest[nameof(systemUnderTest.Name)]);
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top