2017-09-26 9 views
0

J'ai un contrôleur qui appelle une méthode qui a un type de retour de void. Je me moque aussi de l'objet que cette méthode utilise pour utiliser Moq. Existe-t-il une manière spéciale de configurer un simulacre avec une méthode qui a un type de retour de vide? Je suis actuellement en train de faire quelque chose comme ceci:Test d'unité Contrôleur WebApi qui appelle une méthode async avec le type de retour de void et Moq

_mockClient.Setup(m => m.MyMethod(It.IsAny<int>())).Verifiable(); 

L'interface client est comme ceci:

public interface IMyClient 
{ 
    Task MyMethod(int i); 
} 

Voici le test unitaire réel:

public async Task DeleteNavMenuAsync_ReturnsOk() 
{ 
    MyController = new MyController(_mockClient.Object); 

    //TODO: This is always returning a 500, not sure why. 
    IHttpActionResult actionResult = await MyController.DeleteNavMenuAsync(6); 

    _mockClient.Verify(m => m.MyMethod(It.IsAny<int>()),Times.Once()); 
    Assert.IsNotNull(actionResult as OkResult); 
} 

Voici la méthode du contrôleur réelle sous test:

public async Task<IHttpActionResult> DeleteNavMenuAsync(int navMenuId) 
{ 
    try 
    { 
     await Client.MyMethod(navMenuId); //Errors here 
     return Ok(); 
    } 
    catch (Exception e) 
    { 
     return HandleException(e); 
    } 
} 

L'erreur que je reçois est "La référence d'objet n'est pas définie sur une instance d'un objet". J'ai seulement ce problème sur les méthodes qui ont un type de retour de void. La méthode ne pose aucun problème avec les données en direct, c'est seulement un problème avec les Mocks et les tests unitaires. En fin de compte, je cherche juste à vérifier que l'appel renvoie un Ok HttpStatus.

+0

Il n'y a pas beaucoup de point de se moquer de votre contrôleur. Qu'est-ce que vous testez exactement? Habituellement, vous allez simuler les dépendances injectées, mais exécutez le contrôleur pour de vrai. – Crowcoder

+0

La méthode simulée doit très probablement renvoyer une tâche afin de permettre l'attente de flux – Nkosi

+1

Veuillez créer un [mcve] qui reproduit réellement le problème. Si 'Client.MyMethod()' renvoie une exception NullReferenceException, alors 'Client' est nul ou une valeur dont' MyMethod() 'dépend. Aucun n'est montré dans votre question. – CodeCaster

Répondre

1

MyMethod semble renvoyer un Task étant donné qu'il est attendu dans l'exemple fourni.

La méthode simulée doit très probablement renvoyer un Task afin de permettre l'exécution complète du await.

_mockClient.Setup(m => m.MyMethod(It.IsAny<int>())) 
      .Returns(Task.FromResult((object)null)) 
      .Verifiable();