【问题标题】:Signalr hub with Unit Testing带有单元测试的 Signalr 集线器
【发布时间】:2020-03-28 07:28:04
【问题描述】:

我在 .net 框架 4.5 中使用 nUnit Test 和 Signalr,但出现如下错误:

System.Net.Http.HttpRequestException : 发送请求时出错。 ----> System.Net.WebException:无法连接到远程服务器 ----> System.Net.Sockets.SocketException : 无法建立连接,因为目标机器主动拒绝它 127.0.0.1:6790

其实我需要测试一下hub.GetCallControlData();什么时候被调用然后应该调用SetServer方法

代码:

[HubName("SignalRHub")]
public class SignalRHub1 : Hub
{
    public override Task OnConnected()
    {

        return base.OnConnected();
    }
    public override Task OnDisconnected(bool stopCalled)
    {
        return base.OnDisconnected(stopCalled);
    }
    public void GetCallControlData()
    {
        Clients.Caller.SetServer("Server");
    }
}

测试

[TestFixture]
public class SignalrHubTest1
{
    public interface IClientContract
    {

        void SetServer(string s);
    }

    [Test]
    public async Task MockSingalrHub()
    {
        var url = "http://localhost:6790";
        var connectionId = Guid.NewGuid().ToString();
        var mockRequest = new Mock<IRequest>();
        var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
        var mockProxy = new Mock<IHubProxy>();
        var _connection = new HubConnection(url);
        var clientContract = new Mock<IClientContract>();

        var mockHeaders = new Mock<INameValueCollection>();
        mockHeaders.Setup(h => h["host"]).Returns(url); 

        mockRequest.Setup(r => r.Headers).Returns(mockHeaders.Object);
        clientContract.Setup(_ => _.SetServer(It.IsAny<string>()));


        mockClients.Setup(m => m.Caller).Returns(clientContract.Object);

        var hub = new SignalRHub1()
        {

            Clients = mockClients.Object,
            Context = new HubCallerContext(mockRequest.Object, connectionId)
        };


        var _hub = _connection.CreateHubProxy("SignalRHub");
        mockProxy.Setup(x => x.Subscribe(It.IsAny<string>())).Returns(new Subscription());
        _hub.On<string>("SetServer", x => SetServer(x));

       await hub.OnConnected();
        hub.GetCallControlData();
        clientContract.VerifyAll();
        await _connection.Start();
    }
    internal void SetServer(string s)
    {
      //  throw new NotImplementedException();
    }

}

【问题讨论】:

  • 这将是一个集成测试。要将其作为单元测试,您需要模拟中心响应。

标签: c# unit-testing signalr nunit signalr.client


【解决方案1】:

单元测试旨在隔离。无需连接到实际服务器即可验证预期行为。

鉴于显示的Hub,

[HubName("SignalRHub")]
public class SignalRHub1 : Hub {

    public void GetCallControlData() {
        Clients.Caller.SetServer("Server");
    }
}

以下独立单元测试按预期运行,并验证 SetServer("Server") 是否被调用。

[TestClass]
public class SignalrHub1Tests {
    public interface IClientContract {
        void SetServer(string s);
    }

    [TestMethod]
    public void GetCallControlData_Should_SetServer() {
        //Arrange
        var contract = new Mock<IClientContract>();
        contract.Setup(_ => _.SetServer(It.IsAny<string>()));

        var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
        mockClients.Setup(_ => _.Caller).Returns(contract.Object);

        var hub = new SignalRHub1() {
            Clients = mockClients.Object
        };

        //Act
        hub.GetCallControlData();

        //Assert
        contract.Verify(_ => _.SetServer("Server"));
    }
}

【讨论】:

    猜你喜欢
    • 2012-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2010-11-09
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多