Verify.Avalonia
Verify.Avalonia copied to clipboard
Extends Verify to allow verification of Avalonia UIs
Verify.Avalonia
Extends Verify to allow verification of Avalonia UIs.
See Milestones for release notes.
Currently only supported in XUnit since AvaloniaTestAttribute results in incorrect TestContext.Test.MethodName in NUnit
Leverages Avalonia Headless Testing.
See Headless Testing with XUnit and Headless Testing with NUnit for more information.
NuGet package
https://nuget.org/packages/Verify.Avalonia/
Enable
[ModuleInitializer]
public static void Init() =>
VerifyAvalonia.Initialize();
snippet source | anchor
Verify.CommunityToolkit.Mvvm
Many Avalonia projects use CommunityToolkit.Mvvm. To ensure proper serialization of MVVM commands, use Verify.CommunityToolkit.Mvvm.
InternalsVisibleTo
Ensure tests projects have InternalsVisibleTo configured in the target app so tests can use generated controls by name.
<ItemGroup>
<InternalsVisibleTo Include="NUnitTests" />
<InternalsVisibleTo Include="XUnitTests" />
</ItemGroup>
snippet source | anchor
Initialize AvaloniaTestApplication
The [AvaloniaTestApplication]
attribute wires the tests in the current project with the specific application. It needs to be defined once per project in any file. Verify.Avalonia requires that UseHeadlessDrawing
is disabled and .UseSkia()
is set.
[assembly: AvaloniaTestApplication(typeof(TestAppBuilder))]
public static class TestAppBuilder
{
public static AppBuilder BuildAvaloniaApp() =>
AppBuilder.Configure<App>()
.UseSkia()
.UseHeadless(
new()
{
UseHeadlessDrawing = false
});
}
snippet source | anchor
Test
public class CalculatorTests
{
[AvaloniaFact]
public Task Should_Add_Numbers()
{
var window = new MainWindow
{
DataContext = new MainWindowViewModel()
};
window.Show();
// Set values to the input boxes
window.FirstOperandInput.Text = "10";
window.SecondOperandInput.Text = "20";
// Raise click event on the button:
window.AddButton.Focus();
window.KeyPressQwerty(PhysicalKey.Enter, RawInputModifiers.None);
Assert.Equal("30", window.ResultBox.Text);
return Verify(window);
}
}
snippet source | anchor
Result in the following snapshots
Image
Should_Add_Numbers.verified.verified.png:
Text
{
Type: MainWindow,
SizeToContent: WidthAndHeight,
Title: Simple Calculator,
CanResize: false,
Content: {
Type: StackPanel,
Spacing: 10.0,
Margin: 10,
HorizontalAlignment: Left,
Children: [
{
Type: TextBox,
Text: 10,
Watermark: Operand 1,
Name: FirstOperandInput
},
{
Type: TextBox,
Text: 20,
Watermark: Operand 2,
Name: SecondOperandInput
},
{
Type: UniformGrid,
Columns: 4,
Children: [
{
Type: Button,
Command: MainWindowViewModel.Add(),
Content: +,
Name: AddButton
},
{
Type: Button,
Command: MainWindowViewModel.Subtract(),
Content: -,
Name: SubtractButton
},
{
Type: Button,
Command: MainWindowViewModel.Multiply(),
Content: *,
Name: MultiplyButton
},
{
Type: Button,
Command: MainWindowViewModel.Divide(),
Content: /,
Name: DivideButton
}
]
},
{
Type: StackPanel,
Spacing: 10.0,
Orientation: Horizontal,
Children: [
{
Type: TextBlock,
Text: Result:
},
{
Type: TextBlock,
Text: 30,
Name: ResultBox
}
]
}
]
},
Background: LightGray,
Width: 300.0,
Height: 185.0,
IsVisible: true,
DataContext: {
FirstOperand: 10.0,
SecondOperand: 20.0,
Result: 30,
AddCommand: MainWindowViewModel.Add(),
SubtractCommand: MainWindowViewModel.Subtract(),
MultiplyCommand: MainWindowViewModel.Multiply(),
DivideCommand: MainWindowViewModel.Divide()
}
}
snippet source | anchor