Verify.Xaml
December 27, 2025 ยท View on GitHub
Extends Verify to allow verification of Xaml UIs.
See Milestones for release notes.
NuGet
Usage
[ModuleInitializer]
public static void Init() =>
VerifyXaml.Initialize();
A visual element (Window/Page/Control etc) can then be verified as follows:
[Test]
public async Task WindowUsage()
{
var window = new MyWindow();
await Verify(window);
}
With the state of the element being rendered as a verified files:
TheTests.WindowUsage.verified.xml:
<MyWindow
Title="MyWindow"
Width="525"
Height="350"
xmlns="clr-namespace:Tests;assembly=Tests"
xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<av:DockPanel
Name="MyPanel">
<av:Menu
Height="26"
av:DockPanel.Dock="Top">
<av:MenuItem
Header="File">
<av:MenuItem
Header="Exit" />
</av:MenuItem>
<av:MenuItem
Header="View">
<av:MenuItem
IsCheckable="True"
IsChecked="True"
Header="Standard"
Name="StandardMenu" />
</av:MenuItem>
<av:MenuItem
Header="Help">
<av:MenuItem
Header="About" />
</av:MenuItem>
</av:Menu>
<av:Grid
ShowGridLines="False"
Name="MyGrid">
<av:Grid.ColumnDefinitions>
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
<av:ColumnDefinition />
</av:Grid.ColumnDefinitions>
<av:Grid.RowDefinitions>
<av:RowDefinition />
<av:RowDefinition />
<av:RowDefinition />
<av:RowDefinition />
<av:RowDefinition />
<av:RowDefinition />
</av:Grid.RowDefinitions>
<av:Button
Name="B7"
av:Grid.Column="4"
av:Grid.Row="2">7</av:Button>
<av:Button
Name="B8"
av:Grid.Column="5"
av:Grid.Row="2">8</av:Button>
<av:Button
Name="B9"
av:Grid.Column="6"
av:Grid.Row="2">9</av:Button>
<av:Button
Name="B4"
av:Grid.Column="4"
av:Grid.Row="3">4</av:Button>
<av:Button
Name="B5"
av:Grid.Column="5"
av:Grid.Row="3">5</av:Button>
<av:Button
Name="B6"
av:Grid.Column="6"
av:Grid.Row="3">6</av:Button>
<av:Button
Name="B1"
av:Grid.Column="4"
av:Grid.Row="4">1</av:Button>
<av:Button
Name="B2"
av:Grid.Column="5"
av:Grid.Row="4">2</av:Button>
<av:Button
Name="B3"
av:Grid.Column="6"
av:Grid.Row="4">3</av:Button>
<av:Button
Name="B0"
av:Grid.Column="4"
av:Grid.Row="5">0</av:Button>
<av:Button
Name="BPeriod"
av:Grid.Column="5"
av:Grid.Row="5">.</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BPM"
av:Grid.Column="6"
av:Grid.Row="5">+/-</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BDevide"
av:Grid.Column="7"
av:Grid.Row="2">/</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMultiply"
av:Grid.Column="7"
av:Grid.Row="3">*</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMinus"
av:Grid.Column="7"
av:Grid.Row="4">-</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BPlus"
av:Grid.Column="7"
av:Grid.Row="5">+</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BSqrt"
ToolTip="Usage: 'A Sqrt'"
av:Grid.Column="8"
av:Grid.Row="2">Sqrt</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BPercent"
ToolTip="Usage: 'A % B ='"
av:Grid.Column="8"
av:Grid.Row="3">%</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BOneOver"
ToolTip="Usage: 'A 1/X'"
av:Grid.Column="8"
av:Grid.Row="4">1/X</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BEqual"
av:Grid.Column="8"
av:Grid.Row="5">=</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BC"
ToolTip="Clear All"
av:Grid.Column="8"
av:Grid.Row="1">C</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BCE"
ToolTip="Clear Current Entry"
av:Grid.Column="7"
av:Grid.Row="1">CE</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMemClear"
ToolTip="Clear Memory"
av:Grid.Column="3"
av:Grid.Row="2">MC</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMemRecall"
ToolTip="Recall Memory"
av:Grid.Column="3"
av:Grid.Row="3">MR</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMemSave"
ToolTip="Store in Memory"
av:Grid.Column="3"
av:Grid.Row="4">MS</av:Button>
<av:Button
Background="#FFA9A9A9"
Name="BMemPlus"
ToolTip="Add To Memory"
av:Grid.Column="3"
av:Grid.Row="5">M+</av:Button>
<av:TextBlock
Text="Memory: [empty]"
Name="BMemBox"
Margin="10,17,10,17"
av:Grid.Column="3"
av:Grid.Row="1"
av:Grid.ColumnSpan="2" />
<av:TextBox
Name="DisplayBox"
Height="30"
Margin="5,5,5,5"
av:Grid.ColumnSpan="9"
xml:space="preserve"></av:TextBox>
<av:TextBox
Name="PaperBox"
Margin="5,5,5,5"
av:Grid.Row="1"
av:Grid.ColumnSpan="3"
av:Grid.RowSpan="5"
xml:space="preserve"></av:TextBox>
</av:Grid>
</av:DockPanel>
</MyWindow>
TheTests.WindowUsage.verified.png:
OS specific rendering
The rendering of XAML elements can very slightly between different OS versions. This can make verification on different machines (eg CI) problematic. There are several approaches to mitigate this:
Icon
Gem designed by Adnen Kadri from The Noun Project.