How to test Messenger in viewmodel which inherits ObservableRecipient

89 Views Asked by At

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?

0

There are 0 best solutions below