带有单元测试的 Signalr hub

Signalr hub with Unit Testing

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

System.Net.Http.HttpRequestException : An error occurred while sending the request. ----> System.Net.WebException : Unable to connect to the remote server ----> System.Net.Sockets.SocketException : No connection could be made because the target machine actively refused it 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();
    }

}

单元测试应该是独立的。无需连接到实际服务器即可验证预期行为。

鉴于显示 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"));
    }
}