测试ViewModel PropertyChanged事件

时间:2012-03-14 18:31:43

标签: c# unit-testing nunit

我是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 个答案:

答案 0 :(得分:4)

这就是你如何做到的。鉴于这是非常简单(和无聊)的代码,这里没有什么可做的。将它包装在您自己的可重用库/工具中可能是值得的。甚至更好,use existing code

答案 1 :(得分:1)

我对这种事情的“最小”测试略有不同。我不会检查事件是否被引发,而是通常会验证一次

答案 2 :(得分:1)

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。

答案 3 :(得分:0)

我做了一个简单的课程,你可以用它: github

它使用反射来确定在设置公共属性的值时是否引发了属性更改事件。

示例:


[TestMethod]
public void Properties_WhenSet_TriggerNotifyPropertyChanged()
{
    new NotifyPropertyChangedTester(new FooViewModel()).Test();
}