2

いくつかのボタンを含む単純な ViewModel があります。これらのボタンの可視性は、この VM の唯一のコンストラクタ パラメータでもある PaP Prism の EventAggregator で発生するイベントによって変更できます。AutoFixture を使用しない場合、対応するテストは問題なく動作します。

[Theory]
[InfrastructureAutoData]
public void AllButtonsAreShownWhenVisibilityStatusIsSet(
    [Frozen]EventAggregator eventAggregator,
    ActionBarViewModel sut)
{
    eventAggregator
        .GetEvent<ActionButtonActivationEvent>()
        .Publish(VisibleActionButtons.All);

    sut.CancelButtonVisibility.Should().Be(Visibility.Visible);
    sut.BackButtonVisibility.Should().Be(Visibility.Visible);
    sut.NextButtonVisibility.Should().Be(Visibility.Visible);

    sut.Visiblity.Should().Be(Visibility.Visible);
}

残念ながら、AutoFixture によって ViewModel に注入された EventAggregator インスタンスは、テストに注入されたものとは別のインスタンスであるため、ここで指定されているようには機能しません。

public class InfrastructureAutoData : AutoDataAttribute
{
    public InfrastructureAutoData()
    {
        Initialize();
    }

    private void Initialize()
    {
        this.Fixture.Customize(new AutoMoqCustomization());
        Fixture.Register<IEventAggregator>(() => new EventAggregator());
    }
}

public class ActionBarViewModel
{
    public ActionBarViewModel(IEventAggregator eventAggregator)
    {
        eventAggregator.GetEvent<ActionButtonActivationEvent>()
                       .Subscribe(ActivateButtons);

        ActivateButtons(VisibleActionButtons.None);
    }

    /// <summary>
    /// Visibility of a button which cancels the current action.
    /// </summary>
    public Visibility CancelButtonVisibility { get; private set; }

    /// <summary>
    /// Visibility of a button which loads the previous screen.
    /// </summary>
    public Visibility BackButtonVisibility { get; private set; }

    /// <summary>
    /// Visibility of a button with which the next step can be reached.
    /// </summary>
    public Visibility NextButtonVisibility { get; private set; }

    /// <summary>
    /// Visibility of the complete view which will be automatically
    /// set by the visibile buttons.
    /// </summary>
    public Visibility Visiblity { get; private set; }

    private void ActivateButtons(VisibleActionButtons buttonVisibility)
    {
        if (buttonVisibility == VisibleActionButtons.All)
        {
            NextButtonVisibility =
                CancelButtonVisibility =
                    BackButtonVisibility = Visibility.Visible;
        }
        else
        {
            NextButtonVisibility =
                buttonVisibility == VisibleActionButtons.Next
                                    ? Visibility.Visible
                                    : Visibility.Hidden;

            CancelButtonVisibility =
                buttonVisibility == VisibleActionButtons.Cancel
                                    ? Visibility.Visible
                                    : Visibility.Hidden;

            BackButtonVisibility =
                buttonVisibility == VisibleActionButtons.Back
                                    ? Visibility.Visible
                                    : Visibility.Hidden;
        }

        Visiblity =
            buttonVisibility == VisibleActionButtons.None
                                ? Visibility.Collapsed
                                : Visibility.Visible;
    }
}

[凍結] 属性が期待どおりに機能しないように思えますが、すべてが正しく行われたかどうかもわかりません。また、Register ではなく Inject が機能しない理由も知りたいと思いました。私は彼らに違いがないことを期待していたでしょう。

ご協力ありがとうございました。

編集:バージョン3.7を使用しています

4

1 に答える 1