TDD für WPF - XP Days · Idee von TDD bei WPF I XAML-Code bei Bedarf über GUI-Tests testen I...

12
TDD für WPF Andreas Arnold andrena objects ag XP-Days Karlsruhe 14.11.2013

Transcript of TDD für WPF - XP Days · Idee von TDD bei WPF I XAML-Code bei Bedarf über GUI-Tests testen I...

TDD für WPFAndreas Arnoldandrena objects ag

XP-Days Karlsruhe 14.11.2013

Unit-Tests

I Tests für kleine überschaubare EinheitI schnell zu schreibenI schnell zu verstehenI schnell auszuführenI roter Tests liefert Hinweis auf Fehler

TDD für WPF 2

Beispiel für Unit-Test

[TestMethod]public void TestSomeFeatureOnModel(){

var model = new ValidModelWithData();

model.Property = Value;

Assert.IsFalse(model.IsValid);}

TDD für WPF 3

Vorteile von TDD

I Code ist testbarI Tests werden nicht vergessenI Tests erfüllen ihren Sinn

TDD für WPF 4

Probleme von GUI-Tests

I Oftmals starke Abhänigkeit vom FrameworkI Benutzer-Events lassen sich nicht beliebig steuernI Tests sind AufwendigI Tests sind schwer lesbar oder wartbarI Tests sind teilweise vom Aussehen abhängigI Tests sind oft langsam

TDD für WPF 5

Idee von TDD bei WPF

I XAML-Code bei Bedarf über GUI-Tests testenI Code-Behind möglichst nicht nutzen da schwer testbarI MVVM-Pattern anwenden: Model und ViewModel sind gut testbarI Commands nutzen, da gut testbar

TDD für WPF 6

MVVM für WPF

I Model: Enthält Business-LogikI View: Enthält das AussehenI ViewModel: Enthält das Verhalten zum View

TDD für WPF 7

Aktualisierung der View

I PropertyChanged-EventRaisePropertyChanged(()=> Property);

I Testbar über kleine Hilfsklasse

TDD für WPF 8

PropertyChangedHandler

public class PropertyChangedHandler{

private readonly IList<string> _raisedProperties = new List<string>();

public void PropertyChanged(object sender, PropertyChangedEventArgsargs)

{_raisedProperties.Add(args.PropertyName);

}

public void Verify(string property){

Assert.IsTrue(_raisedProperties.Contains(property), "PropertyChanged Event for Property <" + property + "> missing");

}}

TDD für WPF 9

Commands

I Relay-Commands im ViewModelprivate ICommand _loginCommand;public ICommand LoginCommand{

get { return _loginCommand ?? (_loginCommand = new RelayCommand(Login)); }

}

private void Login(){

// Implementation}

I Keine Registrierung im View, sondern Binding vom ViewCommand="{Binding LoginCommand}"

I Testbar über CanExecute und Execute

TDD für WPF 10

UnitTests für Commands

[TestMethod]public void LoginWithCorrectCredentialsOpensMainView(){

var model = new Model();

Assert.IsTrue(model.LoginCommand.CanExecute(null));}

[TestMethod]public void LoginWithCorrectCredentialsOpensMainView(){

var model = new Model();

model.LoginCommand.Execute(null);

Assert.IsTrue(model.IsLoggedIn);}

TDD für WPF 11

Events

I Implementierung im Code-Behind schwer testbarI Umleiten von Events auf CommandsI Microsoft Interactivity bietet Implementierungxmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"<ListBox x:Name="Liste" ...>

<i:Interaction.Triggers><i:EventTrigger EventName="SelectionChanged">

<i:InvokeCommandAction Command="{BindingSelectItemCommand}" CommandParameter="{BindingSelectedItem, ElementName=Liste}"/>

</i:EventTrigger></i:Interaction.Triggers>

</ListBox>

TDD für WPF 12