Концентратор Signalr с модульным тестированием

Я использую nUnit Test и Signalr с .NET framework 4.5 и получаю такую ​​ошибку:

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

}

person sujan maharjan    schedule 03.12.2019    source источник
comment
Это будет интеграционный тест. Чтобы это был модульный тест, вам нужно имитировать ответы хаба.   -  person Kiril1512    schedule 03.12.2019


Ответы (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"));
    }
}
person Nkosi    schedule 03.12.2019