2017-05-25 112 views
1

我正在爲SignalR應用程序編寫模擬測試用例。我剛開始在Unit Testing SignalR Applications的幫助下,但我的要求與在那裏顯示的示例略有不同。 以下是我在Google搜索後完成的代碼。模擬SignalR客戶端的方法。單元測試組

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

單元測試

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

我初學者在單元測試應用程序,只是想確認這是否是嘲笑SignalR組正確的方式。

+1

您是否收到任何錯誤,或者這是意味着是一個代碼審查? – Nkosi

+0

@Nkosi沒有錯誤,測試通過成功。這只是代碼審查,以檢查它是否是正確的方式來模擬?如果沒有,那麼需要你的幫助來糾正它。 – Shri

+0

我測試了上面的代碼,但沒有通過。我的迴應是基於你的代碼無法工作的事實。 – Nkosi

回答

1

Microsoft.AspNet.SignalR.Tests

集線器集團使用的例子是Mockable

客戶的合同需要與必要的方法進行更新。在這種情況下,你將不得不增加Broadcast方法與之相匹配的是如何調用集線器

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

下一步安排通過爲樞紐建立依賴關係的試驗和測試鍛鍊方法。

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

另一種選擇是僞造使用該組的ExpandoObject因爲Clients.Group在這種情況下返回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); 
} 
相關問題