Тестирование событий ViewModel PropertyChanged - PullRequest
6 голосов
/ 14 марта 2012

Я «новичок» в TDD, и я пытаюсь понять, как выполнить модульное тестирование моделей представления ...

Я хочу убедиться, что событие свойства ProeprtyChanged запущено ... У меня есть следующий тест с использованием nunit.

[Test]        
public void Radius_Property_Changed()
{
    var result = false;
    var sut = new MainViewModel();
    sut.PropertyChanged += (s, e) =>
    {
        if (e.PropertyName == "Radius")
        {
            result = true;
        }
    };

    sut.Radius = decimal.MaxValue;
    Assert.That(result, Is.EqualTo(true));
}

Это самый чистый способ сделать это, или есть лучший способ проверить это свойство

... фрагмент кода в модели представления объекта, который я тестирую, выглядит следующим образом ...

public decimal Radius
{
    get { return _radius; }
    set
    {
        _radius = value;
        OnPropertyChanged("Radius");
    }
}

Ответы [ 4 ]

4 голосов
/ 14 марта 2012

Это в значительной степени, как вы это делаете.Здесь больше нечего делать, учитывая, что это довольно простой (и скучный) код.Возможно, стоит обернуть это в свою собственную библиотеку / инструмент многократного использования.Или, что еще лучше, используйте существующий код .

1 голос
/ 14 марта 2012

Среда тестирования Granite позволяет вам писать такие тесты:

    [TestMethod]
    public void ChangeTrackingModelBase_BasicFunctionalityTest()
    {
        var person = new ChangeTrackingPerson();
        var eventAssert = new PropertyChangedEventAssert(person);

        Assert.IsNull(person.FirstName);
        Assert.AreEqual("", person.LastName);

        eventAssert.ExpectNothing();

        person.FirstName = "John";

        eventAssert.Expect("FirstName");
        eventAssert.Expect("IsChanged");
        eventAssert.Expect("FullName");

        person.LastName = "Doe";

        eventAssert.Expect("LastName");
        eventAssert.Expect("FullName");

        person.InvokeGoodPropertyMessage();
        eventAssert.Expect("FullName");

        person.InvokeAllPropertyMessage();
        eventAssert.Expect("");

    }

http://granite.codeplex.com/SourceControl/list/changesets

Он основан на MSTest, но вы можете легко переписать его для работы с NUnit.

1 голос
/ 14 марта 2012

Мой собственный "минимальный" тест для такого рода вещей немного отличается. Вместо того, чтобы проверять, что событие вызвано, я обычно проверяю, что оно возникает ровно один раз .

0 голосов
/ 08 августа 2012

Я создал простой класс, который вы можете использовать для этого: github

Он использует отражение, чтобы определить, было ли вызвано событие, изменяющее свойство, когда значение установлено для открытогосвойство.

Пример:


[TestMethod]
public void Properties_WhenSet_TriggerNotifyPropertyChanged()
{
    new NotifyPropertyChangedTester(new FooViewModel()).Test();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...