2013-09-20 5 views
2

У меня есть простая ViewModel, которая содержит несколько кнопок. Видимость этих кнопок может быть изменена событиями, поднятыми с помощью EventAggregator PaP Prism, который также является единственным параметром конструктора этой виртуальной машины. Соответствующий тест работает отлично, когда я не использую AutoFixture.AutoFixture.Xunit's [Frozen] не работает

[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); 
} 

К сожалению, это не работает, как это дано здесь, так как экземпляр EventAggregator впрыскивается в ViewModel по AutoFixture еще один пример, чем один впрыскивается в тесте.

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; 
    } 
} 

Мне кажется, что [Frozen] атрибут не работает, как ожидалось, но я также не уверен, что если сделал все, что правильно. Мне также было интересно, почему Inject вместо Register не работает. Я бы ожидал, что их нет никакой разницы.

Благодарим за помощь.

Edit: Я использую версию 3.7

ответ

5

Вы замораживанием конкретный класс EventAggregator, но инъекционного интерфейс IEventAggregator. Они два разных типа, поэтому экземпляр IEventAggregator, который вы получаете, не является замороженным EventAggregator.

[Frozen(As = typeof(IEventAggregator))]EventAggregator eventAggregator 

должен сделать трюк.

+0

Спасибо, Марк, это очень помогло мне. –