2012-03-14 74 views
5

我是一个“初学者”在TDD和什么我试图找出是如何单元测试的ViewModels ...测试视图模型的PropertyChanged事件

我想,以确保财产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

这几乎是你如何做到这一点。考虑到它非常简单(和无聊)的代码,在这里没有太多的事情要做。将它包装在您自己的可重用的库/工具中可能是值得的。或者更好,use existing code

+0

我已经重构它使用[TestCase的],并使其更通用...感谢您的建议 – 2012-03-15 04:21:15

1

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

+0

好一点 - 值得考虑的 – 2012-03-15 04:19:42

1

花岗岩的测试框架可以让你写测试是这样的:

[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的工作。

+0

谢谢,我会检查出花岗岩 - 这看起来对我来说更像是一个集成测试,但肯定是我想要涵盖的内容 – 2012-03-15 04:20:33

+0

集成测试?不,它不会与任何外部服务或数据库交谈。 – 2012-03-15 06:08:19

0

我做了一个简单的类,你可以使用这个: github

它使用反射来determin如果当值设置公共财产都提出了一个属性更改事件。

例子:


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