2012-03-14 19 views
5

jestem „początkujący” w TDD i coś próbuję dowiedzieć się, jak jednostka ViewModels testowych ...Testowanie ViewModel PropertyChanged Wydarzenia

Ja chce mieć pewność, że zdarzenie nieruchomość ProeprtyChanged jest zwolniony. .. Mam następujący test przy użyciu 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)); 
} 

Czy ta najczystszym sposobem na to, czy jest jakiś lepszy sposób, aby przetestować tę właściwość

... fragment kodu w viewmodel z propety jestem testowania wygląda tak ..

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

Odpowiedz

4

To jest prawie jak to zrobić. Nie ma tu wiele do zrobienia, ponieważ jest to dość prosty (i nudny) kod. Warto ją zawinąć we własnej bibliotece/narzędziu wielokrotnego użytku. Albo jeszcze lepiej, use existing code.

+0

Mam refactored go używać [TestCase] ​​i staje się on bardziej rodzajowe ... dzięki za sugestię –

1

Mój własny "minimalny" test tego typu rzeczy jest nieco inny. Zamiast sprawdzać, czy zdarzenie zostało podniesione, zwykle sprawdzam, czy jest ono podniesione dokładnie raz. Testowanie ramy

+0

dobry punkt - coś warte rozważenia –

1

granit za pozwala pisać testy tak:

[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

Jest on oparty na MSTest, ale można łatwo przerobić go do pracy z NUnit.

+0

Dzięki, będę sprawdzeniu granity - to bardziej przypomina mi test integracji, ale na pewno coś, co chciałbym objąć testem integracji –

+0

? Nie, nie rozmawia z żadną szeroką usługą ani bazą danych. –

0

Zrobiłem prostą klasę, której można użyć do tego: github

Wykorzystuje odbicie w określeniu, czy nieruchomość została podniesiona wydarzenie zmieniło, gdy wartość jest ustawiona na własność publiczną.

Przykład:


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