Basierend auf PublishOnUIThreadAsync
Erweiterung Methode, die eine Aufgabe gibt
/// <summary>
/// Publishes a message on the UI thread asynchrone.
/// </summary>
/// <param name="eventAggregator">The event aggregator.</param>
/// <param name="message">The message instance.</param>
public static Task PublishOnUIThreadAsync(this IEventAggregator eventAggregator, object message) {
Task task = null;
eventAggregator.Publish(message, action => task = action.OnUIThreadAsync());
return task;
}
Sie würden feststellen, dass die Aufgabe innerhalb der Maßnahme wird durch Publish
ausgeführt wird. Sie müssen die Aktion aufrufen, damit die Aufgabe zugewiesen wird, indem Sie sicherstellen, dass der Delegat/die Aktion aufgerufen wird. Sie können dies innerhalb eines Rückrufs der verspotteten Methode tun.
Das folgende minimale Beispiel zeigt, wie das gemacht wird. Beachten Sie, wie Publish
mit dem Rückruf eingerichtet wird, um das übergebene Action-Argument aufzurufen.
[TestClass]
public class MyTestClass {
[TestMethod]
public async Task _EventAggregator_Should_Publish_OnUIThread() {
//Arrange
MyEvent navigateEvent = null;
var eventAggregatorMock = new Mock<IEventAggregator>();
eventAggregatorMock
.Setup(x => x.Publish(It.IsAny<MyEvent>(), It.IsAny<Action<System.Action>>()))
.Callback((object message, Action<System.Action> marshal) => {
navigateEvent = (MyEvent)message;
marshal(() => { });//Invoking action that would cause task to be assigned
});
var sut = new MyClass(eventAggregatorMock.Object);
//Act
await sut.Navigate();
//Assert
navigateEvent.Should().NotBeNull();
eventAggregatorMock.Verify(_ => _.Publish(It.IsAny<MyEvent>(),
It.IsAny<Action<System.Action>>()), Times.Once);
}
public class MyEvent {
private int p;
public MyEvent(int p) {
// TODO: Complete member initialization
this.p = p;
}
}
public class MyClass {
IEventAggregator eventAggregator;
public MyClass(IEventAggregator eventAggregator) {
this.eventAggregator = eventAggregator;
}
public async Task Navigate() {
await eventAggregator.PublishOnUIThreadAsync(new MyEvent(5));
}
}
}
Was genau funktioniert nicht? –
Was ist der Fehler, auf den Sie gestoßen sind? Es wird auch angenommen, dass Sie ein Setup für die betreffende Methode bereitgestellt haben. – Nkosi