在单元测试中模拟 SignalR Clients.Group 的方法
Ways to mock SignalR Clients.Group in unit test
我正在为 SignalR 应用程序编写模拟测试用例。我刚刚在 Unit Testing SignalR Applications 的帮助下开始,但我的要求与此处显示的示例略有不同。
以下是我在谷歌搜索后完成的代码。
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 组的正确方法。
使用来自 Microsoft.AspNet.SignalR.Tests
的例子
Hubs 组是可模拟的
需要使用必要的方法更新客户端合约。在这种情况下,您将必须添加 Broadcast
方法以匹配它在 Hub
中的调用方式
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
returns 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);
}
我正在为 SignalR 应用程序编写模拟测试用例。我刚刚在 Unit Testing SignalR Applications 的帮助下开始,但我的要求与此处显示的示例略有不同。 以下是我在谷歌搜索后完成的代码。
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 组的正确方法。
使用来自 Microsoft.AspNet.SignalR.Tests
的例子Hubs 组是可模拟的
需要使用必要的方法更新客户端合约。在这种情况下,您将必须添加 Broadcast
方法以匹配它在 Hub
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
returns 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);
}