Как ошибки модульного тестирования в бизнес -объекте Idataerrorinfo?

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

Вопрос

Я пишу (пытаюсь написать) модульные тесты для приложения WPF.

Бизнес -объекты, которые пользовательский интерфейс связывает для реализации idataerrorinfo, так что, когда я устанавливаю validatesondataerrors = true, в моем представлении xaml, индексера ошибок (этот []) называется в любое время, когда называется установщик для связанного бизнес -объекта. Эта часть отличная.

Теперь, если я назову сеттером этого же свойства из Unittest, он никогда не вызовет индексера ошибок. Как заставить индексера Idataerrorinfo оцениваться из модульного теста?

Просто для иллюстрации, вот один из моих простых индексеров ошибок, который содержит свойство имени. Настройка 'myobject.name = string.empty;' действительно вызывает сеттер, но не индексатор ошибок, когда я делаю это в своих модульных тестах.

        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

Спасибо!

Это было полезно?

Решение

С версии 2.1.0-M1 Maven поддерживает специальный синтаксис для получения времени сборки в POM.xml, проверить DOC здесь :

<project>
  ...
  <properties>
    <maven.build.timestamp.format>yyyyMMdd.HHmmss</maven.build.timestamp.format>
  </properties>
  ...
</project>
.

В качестве альтернативы вы можете использовать Buildnumber-Maven-Plugin . .

Другие советы

Вам нужно зацепить PropertyChanged Соблюдайте сами, а затем, когда ваш обработчик звонит, позвоните индексере с именем свойства. Или не зажимайте в событие и не назовите индексатор с именем свойства, которое вы тестируете.

Вот что делает .net. Он вызывает индексатор с именами свойств.

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

Следующие тесты NUNIT называют индексером для свойства имени и проверяют сообщение об ошибке.

[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)]);
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top