2012-03-14 4 views
5

Je suis un « débutant » à TDD, et quelque chose que je suis en train de comprendre comment est viewmodels de test unité ...Test ViewModel PropertyChanged Events

Je suis désireux de faire en sorte qu'une propriété événement ProeprtyChanged est tiré. .. J'ai le test suivant en utilisant 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)); 
} 

Est-ce la plus propre façon de le faire, ou est-il une meilleure façon de tester cette propriété

... bout de code dans le viewmodel du propety je teste ressemble à ceci ..

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

Répondre

4

C'est à peu près ce que vous faites. Il n'y a pas grand chose d'autre à faire ici étant donné que c'est un code assez simple (et ennuyeux). Il pourrait être utile d'envelopper dans votre propre bibliothèque/outil réutilisable. Ou encore mieux, use existing code.

+0

Je refondus à utiliser [TestCase] ​​et a rendu plus générique ... Merci pour la suggestion –

1

Mon propre test "minimal" pour ce genre de chose est légèrement différent. Au lieu de vérifier que l'événement est surélevé, je vérifie habituellement qu'il est levé exactement une fois.

+0

Bon point - quelque chose à considérer –

1

cadre de tests de granit vous permet d'écrire des tests comme celui-ci:

[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

Il est basé sur MSTest, mais vous pouvez facilement réécrire pour travailler avec NUnit.

+0

Merci, je vais vérifier Granite - ce ressemble plus à un test d'intégration pour moi, mais certainement quelque chose que je voudrais couvrir –

+0

Test d'intégration? Non, il ne parle à aucun service ou base de données externe. –

0

J'ai fait une classe simple que vous pouvez utiliser pour cela: github

Il utilise la réflexion pour determin si un événement changé de propriété a été soulevée lorsque la valeur est définie d'une propriété publique.

Exemple:


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