Как проверить метод, переданный для подписки на метод PubSubEvent в библиотеке Wpf Prism? - PullRequest
0 голосов
/ 04 января 2019

У меня есть две модели ViewModel, MainWindowShellViewModel (shellVm) и MainWindowContentViewModel (contentVm). ShellVm публикует событие, и contentVm подписывается на него.

Оболочка виртуальной машины выглядит примерно так: Я опустил много деталей.

// ctor
public MainWindowShellViewModel(IEventAggregator eventAggregator)
{
    _EventAggregator = eventAggregator ?? throw new ArgumentNullException(nameof(IEventAggregator) + " service injected is null!!!");

    _AppStartingClosingEventToken = _EventAggregator.GetEvent<AppStartingClosingEvent>();
}

private void MainWindowShellLoaded()
{
    var payload = new AppStartingClosingEventData();
    payload.Data = "MainWindowStarting";
    _AppStartingClosingEventToken.Publish(payload);
}

AppStartingClosingEvent представляет собой простой способ, как показано ниже.

public class AppStartingClosingEvent : PubSubEvent<AppStartingClosingEventData>
{ }

public class AppStartingClosingEventData
{
    public string Data { get; set; }
}

И, наконец, contentVm выглядит следующим образом.

public MainWindowContentViewModel(IEventAggregator eventAggregator)
{
    _AppClosingEventToken.Subscribe(AppStartingClosing);
}
private void AppStartingClosing(AppStartingClosingEventData appStartingClosingEventData)
{
    if (appStartingClosingEventData.Data == "MainWindowStarting")
        LoadState(appStartingClosingEventData);
    if (appStartingClosingEventData.Data == "MainWindowClosing")
        SaveState(appStartingClosingEventData);
}

Я хочу проверить, что метод AppStartingClosing внутри contentVm вызывается с правильными данными. Я использую Moq У меня заканчиваются идеи. Пожалуйста, предложите. Пробовал следующее, но пока безуспешно.

Как проверить подписки агрегатора событий Prism на UIThread?

Использование Moq для проверки сбоя подписки на событие Prism

Модульное тестирование с Moq, Prism 6 и агрегацией событий

Moq Event Aggregator Возможно ли это // Проверка того, что делегат был вызван с помощью Moq

EDIT

Вот что я пробовал.

// Arrange
var mockingKernel = new MoqMockingKernel();
var eventAggregatorMock = mockingKernel.GetMock<IEventAggregator>();
var eventBeingListenedTo = new AppStartingClosingEvent();
eventAggregatorMock.Setup(e => e.GetEvent<AppStartingClosingEvent>()).Returns(eventBeingListenedTo);            
var vm = mockingKernel.Get<MainWindowContentViewModel>();
var evData = new AppStartingClosingEventData();
evData.Data = "MainWindowStarting";

        // Act
eventBeingListenedTo.Publish(evData);

Теперь, что мне делать? Мне даже не ясно, правильно ли я подошел.

1 Ответ

0 голосов
/ 04 января 2019

Что мне теперь делать?

После eventBeingListenedTo.Publish(evData); посмотрите, действительно ли какой-либо эффект SaveState должен иметь место.

Мне даже не ясно, правильно ли я подошел.

Вы не хотите проверять, вызывается ли один метод в классе другим методом этого класса.

Так что вместо попытки сделать

subjectUnderTest.DoStuff();

MagicallyVerifyThatThisGotCalled( () => subjectUnderTest.SomeEffect() );

вы должны сделать

var subjectUnderTest = new SubjectUnderTest( serviceMock.Object );

subjectUnderTest.DoStuff();

serviceMock.Verify( x => x.SomeEffectOnTheService(), Times.Once );
Assert.That( subjectUnderTest.SomePropertyThatsChanged, Is.EqualTo( newValue ) );

Все, что SubjectUnderTest делает внутри для достижения желаемого эффекта, не входит в объем теста. Это личное SubjectUnderTest, вам все равно как это делается, если это вообще делается. При тестировании посмотрите на внешне видимое состояние тестируемого объекта и его влияние на его зависимости.

...