2017-05-25 4 views
1

Ich schreibe Mock Testfälle für SignalR-Anwendung. Ich habe gerade mit der Hilfe von Unit Testing SignalR Applications begonnen, aber meine Anforderung ist ein wenig anders als das dort gezeigte Beispiel. Folgendes ist der Code, den ich nach dem googlen gemacht habe.Möglichkeiten, SignalR Clients.Group im Komponententest zu verharmlosen

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

Einheit Test

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

Ich bin Anfänger in Unit-Test-Anwendung, möchte nur bestätigen, wenn dies der richtige Weg ist, SignalR Gruppen zu verspotten.

+1

Erhalten Sie Fehler oder ist dies eine Code-Review mit sein soll? – Nkosi

+0

@Nkosi Kein Fehler, Test erfolgreich bestanden. Es ist nur für Code-Review, um zu überprüfen, ob es richtig ist zu verspotten? Wenn nicht, dann brauchen Sie Ihre Hilfe, um es zu korrigieren. – Shri

+0

Ich habe den Code, den Sie oben hatten, getestet und es ist nicht bestanden worden. Mein Antwort-Schlag beruhte auf der Tatsache, dass dein Code nicht funktionierte. – Nkosi

Antwort

1

Anhand von Beispielen aus Microsoft.AspNet.SignalR.Tests

Hubs Gruppe mockable

Der Kunde Vertrag muss mit den notwendigen Methoden aktualisiert werden. In diesem Fall müssen Sie Broadcast Methode hinzufügen zu entsprechen, wie es in dem Hub

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

Als nächsten ordnen Sie den Test durch die Einrichtung, die Abhängigkeiten für die Nabe und zur Ausübung des Verfahrens im Test bezeichnet wird.

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

wäre eine weitere Option zu fälschen sein die Gruppe ein ExpandoObject da Clients.Group in diesem Fall gibt 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); 
} 
Verwandte Themen