2017-09-06 6 views
2

De mon previous question, j'ai appris que je dois faire Mock.Setup pour que le eventAggregatorMoq connaisse les données de retour.Configurer moq avec l'agrégateur d'événements Caliburn pour un retour à la ligne de publication PublishOnUIThreadAsync

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

Ce qui suit fonctionnait très bien pour couvrir la méthode d'emballage ci-dessus qui n'a pas été await ING et retour void. Donc, comment est-ce que je m'installe dans le cas où j'attends sur ma méthode qui renvoie la tâche.?

eventAggregatorMock.Verify(_ => _.Publish(It.IsAny<MyEvent>(), 
           It.IsAny<Action<System.Action>>()), Times.Once); 

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

Qu'est-ce qui ne fonctionne pas exactement? –

+0

Quelle est l'erreur que vous avez rencontrée? Il est également supposé que vous avez fourni une configuration pour la méthode en question. – Nkosi

Répondre

0

Basé sur PublishOnUIThreadAsync méthode d'extension, qui renvoie une tâche

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

Vous remarquerez que le groupe est affecté au sein de l'action en cours d'exécution par Publish. Vous devez appeler l'action pour que la tâche soit assignée en vous assurant que le délégué/action est appelé. Vous pouvez le faire dans un rappel de la méthode simulée.

L'exemple minimal suivant montre comment procéder. Notez comment Publish est configuré avec le rappel pour appeler l'argument Passé dans Action.

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