2017-09-06 1 views
2

Von meinem previous question habe ich gelernt, dass ich Mock.Setup zu tun habe, um die eventAggregatorMoq über die Rückgabedaten wissen zu lassen.Setup moq mit Caliburn Event Aggregator für eine Methode Wrapping PublishOnUIThreadAsync

public void Navigate() { 
    eventAggregator.PublishOnUIThreadAsync(new MyEvent(5)); 
} 

Folgendes wurde arbeitet zum Abdecken des obigen feinen wrapper Verfahren, die nicht await ing und Zurückkehren void war.

Also, wie installiere ich im Fall, wenn ich auf meine Methode warte, die Task zurückgibt.

public async Task Navigate() { 
    await eventAggregator.PublishOnUIThreadAsync(new MyEvent(5)); 
} 
+1

Was genau funktioniert nicht? –

+0

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

Antwort

0

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)); 
     } 
    } 
} 
Verwandte Themen