Upload
others
View
25
Download
0
Embed Size (px)
Citation preview
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