Ein wiederkehrendes Problem das es zu lösen gilt wenn man typische Oberflächen testen möchte, ist die Prüfung auf einen Validierungsrahmen. Solche Rahmen werden immer dann eingesetzt wenn der Nutzer auf eine Falscheingabe hingewiesen werden soll. Dummerweise kann die UI Automation uns keine Informationen über jene Rahmen geben, da sie sie selbst nicht kennt. Wie also vorgehen?

Validierungsrahmen

Der erste Schritt wäre zu prüfen ob das ViewModel die Daten auch wirklich als invalide kennzeichnet. Dies geht aber häufig nicht, weil die gesamte Validierung im WPF bzw. irgend welchen Frameworks im Hintergrund ausgeführt wird. Aus diesem Grund kann man sich eines einfachen Tricks bedienen. Dazu ist der Attached Property ItemStatus, einfach ein entsprechender Wert zuzuweisen, sobald das Steuerelement auf invalide geschaltet wird. Jener ItemStatus kann dann über die UI Automation ausgewertet werden.

So kann man den ItemStatus an eine Property des Steuerelements binden die von der Validierung beeinflusst wird. Dies hat dann aber den Nachteil, dass man das Vorgehen für jede Instanz eines jeden Steuerelements erneut durchführen muss. Zudem kann man sich nicht sicher sein ob der Status den man so erhält auch dauerhaft gleich bleibt. Was wenn die Fehlerfarbeit beispielsweise irgend wann von #ff0000 auf #ff1111 geändert wird? Dann sind schnell alle UI Tests brüchig.

AutomationProperties.ItemStatus="{Binding RelativeSource={RelativeSource Self}, Path=Background}" />

Da ist es schon um einiges einfacher einen Style zu verwenden. Vor allem dann, wenn man direkten Einfluss auf das DataTemplate oder ErrorTemplate des Controls nehmen kann:

Property="Validation.HasError" Value="True">
   Property="AutomationProperties.ItemStatus" Value="invalid" />
</Trigger>
Property="Validation.HasError" Value="False">
   Property="AutomationProperties.ItemStatus" Value="valid" />
</Trigger>

Auf diese Weise wird immer der Wert valid bzw. invalid genutzt, wodurch die Wahrscheinlichkeit eines Fehlers geringer wird, der durch eine Änderung am Style vorkommen kann.