I'm struggling with unit test in WPF CommunityToolkit.Mvvm.
I'm testing ViewModel, And I want to mock Messenger for testing Messenger object in ViewModel which inherits ObservableRecipient.
this is my ViewModel.
public class MapViewModel : ObservableRecipient
{
private readonly IRailPartsDataProvider _railPartsDataProvider;
public MapViewModel(IRailPartsDataProvider railPartsDataProvider)
{
_railPartsDataProvider = railPartsDataProvider;
}
public async Task Load()
{
var railParts = await _railPartsDataProvider.GetRailPartsAsync();
RailParts.Clear();
foreach (var railPart in railParts)
{
RailParts.Add(railPart);
}
}
public ObservableCollection<RailPart> RailParts { get; set; } = new();
}
And this is my Test code ( XUnit )
[Fact]
public async Task ShouldPublishRailPartsLoadedMessageWhenLoadRailParts()
{
// Arrange
var mockMessenger = new Mock<IMessenger>();
var viewModel = new MapViewModel(new Mock<IRailPartsDataProvider>().Object);
// Act
await viewModel.Load();
viewModel.Messenger = mockMessenger.Object;
// Assert
mockMessenger.Verify(x => x.Send(It.IsAny<RailPartsLoadedMessage>()), Times.Once);
}
But ViewModel's Messenger property is defined with protected accessor.
Are there any other ways to test?