hoetz
hoetz

Reputation: 2388

How to unit test ActivateItem on a Conductor

Consider this Viewmodel:

 public class MainViewModel : Conductor<object>
{
    private readonly IEventAggregator eventAggregator;
    private readonly IWindowManager windowManager;
    IConfigurationViewModel configurationViewModel;

    /// <summary>
    /// Initializes a new instance of the MainViewModel class.
    /// </summary>
    public MainViewModel(IEventAggregator eventAggregator,IWindowManager windowManager,IConfigurationViewModel configurationViewModel)
    {
        this.eventAggregator = eventAggregator;
        this.windowManager = windowManager;
        this.eventAggregator.Subscribe(this);
        this.configurationViewModel = configurationViewModel;
    }

    public void GoToConfiguration()
    {
        ActivateItem(configurationViewModel);
    }

}

 public interface IConfigurationViewModel:IScreen
{

}
public class ConfigurationViewModel :Screen, IConfigurationViewModel
{

}

This might just be a simple example, but I want to test the GoToConfigurationMethod. Inheriting from the base class makes this difficult. This for example does not work:

 [Theory]
    [AutoDomainData]
    public void GoToConfiguration_ActivatesConfigurationView([Frozen]IConfigurationViewModel configVm,MainViewModel sut)
    {
        sut.GoToConfiguration();
        Assert.True(configVm.IsActive);
    }

Upvotes: 1

Views: 640

Answers (1)

Nigel Sampson
Nigel Sampson

Reputation: 10609

The problem is that because MainViewModel isn't Active then it won't Activate ConfigurationViewModel.

[Fact]
public void GoToConfigurationActivatesCorrectViewModel()
{
    var configuration = new ConfigurationViewModel();
    var main = new MainViewModel(configuration);

    ScreenExtensions.TryActivate(main);

    main.GoToConfiguration();

    Assert.True(configuration.IsActive);
}

This test passes the important line being to Activate the view model first.

Upvotes: 3

Related Questions