2017-05-25 1 views
1

J'écris des cas de test fictif pour l'application SignalR. Je viens de commencer avec l'aide de Unit Testing SignalR Applications, mais mon exigence est un peu différent de l'exemple montré ici. Voici le code que j'ai fait après googling.Façons de se moquer des clients SignalR.Groupe en test unitaire

SignalRHub

public class HubServer : Hub 
{ 
    [HubMethodName("SendNofication")] 
    public void GetNofication(string message) 
    { 
     try 
     { 
      Clients.Group("Manager").BroadCast(message); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 
    }   
} 

Test Unit

public interface IClientContract { } 

[TestMethod] 
public void GetNoficationTest() 
{ 
    var hub = new HubServer(); 
    var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>(); 
    hub.Clients = mockClients.Object; 
    var all = new Mock<IClientContract>(); 
    string message = "Message to send"; 

    mockClients.Setup(m => m.Group("Manager")).Returns(message); 
    mockClients.Setup(m => m.All).Returns(all.Object); 

    hub.GetNofication("Mock call to SingalR hub"); 
    all.VerifyAll(); 
} 

Je suis débutant dans l'application Unit Test, je veux juste confirmer si cela est la bonne façon de se moquer de groupes SignalR.

+1

Obtenez-vous des erreurs ou est ce censé être une revue de code? – Nkosi

+0

@Nkosi Pas d'erreur, test réussi. C'est juste pour l'examen du code pour vérifier si c'est la bonne façon de se moquer? sinon, alors besoin de votre aide pour le corriger. – Shri

+0

J'ai testé le code que vous avez ci-dessus et il n'a pas réussi. Mon coup de réponse était basé sur le fait que votre code ne fonctionnait pas. – Nkosi

Répondre

1

Utilisation des exemples de Microsoft.AspNet.SignalR.Tests

Groupe Hubs sont mockable

Le contrat client doit être mis à jour avec les méthodes nécessaires. Dans ce cas, vous devrez ajouter Broadcast méthode selon la façon dont il est appelé dans le Hub

public interface IClientContract { 
    void Broadcast(string message); 
} 

suivant organiser le test en mettant en place les dépendances pour le moyeu et l'exercice de la méthode à l'essai.

[TestMethod] 
public void _GetNoficationTest() { 
    // Arrange. 
    var hub = new HubServer(); 
    var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>(); 
    var groups = new Mock<IClientContract>(); 
    var message = "Message to send"; 
    var groupName = "Manager"; 

    hub.Clients = mockClients.Object; 
    groups.Setup(_ => _.Broadcast(message)).Verifiable(); 
    mockClients.Setup(_ => _.Group(groupName)).Returns(groups.Object); 

    // Act. 
    hub.GetNofication(message); 

    // Assert. 
    groups.VerifyAll(); 
} 

Une autre option serait de simuler le groupe à l'aide d'un ExpandoObject étant donné que dans ce cas Clients.Group retourne dynamic

[TestMethod] 
public void _GetNoficationTest_Expando() { 
    // Act. 
    var hub = new HubServer(); 
    var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>(); 
    dynamic groups = new ExpandoObject(); 
    var expected = "Message to send"; 
    string actual = null; 
    var groupName = "Manager"; 
    bool messageSent = false; 

    hub.Clients = mockClients.Object; 
    groups.Broadcast = new Action<string>(m => { 
     actual = m; 
     messageSent = true; 
    }); 
    mockClients.Setup(_ => _.Group(groupName)).Returns((ExpandoObject)groups); 

    // Act. 
    hub.GetNofication(expected); 

    // Assert. 
    Assert.IsTrue(messageSent); 
    Assert.AreEqual(expected, actual); 
}