通过nunit

时间:2016-12-05 16:22:16

标签: c# signalr nunit resharper

我有SinglaR集线器类“MyHub”和一个在运行时成功连接到它的.net客户端类。然而,当我用nunit测试测试客户端它没有连接时,我调试了测试并发现该集线器实例不是由SinglaR的集线器激活器类创建的。 我正在使用Resharper nunit runner进行测试。

这是我的集线器类结构,为了简单起见,我删除了方法的主体。

[HubName("myHub")]
public class MyHub : Hub
{
    private static readonly ILog Logger = LogManager.GetLogger(typeof(MyHub));




    #region MyRegion

    #region Connection Methods


    public MyHub()
    {

    }


    private static int c;
    public override Task OnConnected()
    {

    }

    private string UserNameConnectionId
    {

    }

    public override Task OnReconnected()
    {
        lock (LockObject)
        {

         }
    }

    public override Task OnDisconnected(bool b)
    {
        lock (LockObject)
        {

        }
    }

    private void LogUserActivity(string userName, string activity)
    {

    }

    #endregion

    //Live controls invoke this Method to send their required data and also their ConnectionId
    /// <summary>
    /// </summary>
    /// <param name="liveControlsInfo"></param>
    public Task UpdateLiveControlsInfo(LiveControlInfo[] liveControlsInfo)
    {
        lock (LockObject)
        {

        }
    }



    public string GetValue()
    {
        return "SignalR Rox!";
    }


    public void Acknowledge()
    {
        lock (LockObject)
        {
            string connectionId = Context.ConnectionId;

            }
        }
    }

    #endregion


    }


}

这是HubWinClient类

public class HubWinClient
{
    private readonly string _userName;
    public int ServerPort { get; set; }
    private static readonly ILog logger = LogManager.GetLogger(typeof (HubWinClient));
    protected int HubLogCounter = 0;
    private HubConnection connection;

    private bool moduleStarted;
    private IHubProxy myHub;

    public HubWinClient(int serverPort, string userName= "Windows Hub Client", bool tryConnect=false)
    {
        _userName = userName;
        ServerPort = serverPort;
    }

    public void Start()
    {
        ConnectToHub();
        moduleStarted = true;
    }

    public void Stop()
    {
        DisconnectFromHub();
        moduleStarted = false;
    }

    public void ConnectToHub()
    {
        ConnectToHub(false);
    }

    public event EventHandler<EventArgs> ConnectingToHub = delegate { };
    public event EventHandler<EventArgs> ConnectedToHub = delegate { };

    /// <summary>
    /// callback event called by hubhost
    /// </summary>
    public event EventHandler<int> LogSentToHub = delegate { };

    public event EventHandler<EventArgs> DisonnectedFromHub = delegate { };
    public event EventHandler<EventArgs> HubConnectionError = delegate { };
    public event EventHandler<EventArgs> HubInvokeError = delegate { };
    public event EventHandler<EventArgs> HubInvokeSuccess = delegate { };
    public event EventHandler<EventArgs> NotConnectedToSentLog = delegate { };
    public event EventHandler<LogMessage> DataRecivedFromHub = delegate { };

    /// <summary>
    ///     connects HunNotifier to Hun in order to ListenerMessage passing can be done
    /// </summary>
    /// <param name="reconnect"></param>
    private void ConnectToHub(bool reconnect)
    {
        //This url will not point to a specific connection. But will instead point to the root of your site=root of hub server.

        string hubAddress = "http://localhost:" + ServerPort;
        connection = new HubConnection(hubAddress, new Dictionary<string, string>{{"UserName", _userName } });

        ConnectingToHub(this, new EventArgs());
        if (reconnect)
            logger.InfoFormat("HubWinClient reconnecting to HubHost @ {0}...", hubAddress);
        else
            logger.InfoFormat("HubWinClient connecting to HubHost @ {0}...", hubAddress);

        myHub = connection.CreateHubProxy("myHub");

        myHub.On("joined", joined);
        myHub.On("rejoined", rejoined);
        myHub.On("leaved", leaved);
        myHub.On<LogMessage>("addData", addData);
        myHub.On<int>("LogSentToWeb", LogSentToWeb);
        connection.StateChanged += change =>
        {
            var a = change;
            var b = 10;
            var a1 = connection.LastError;
            var b2 = connection.Proxy;
        };
        try
        {
            connection.Start();

        }
        catch (AggregateException aggregateException)
        {
            Exception exception = aggregateException.InnerException;
            logger.Error("HubWinClient connection to HubHost exception...", exception);
            HubConnectionError(this, new MyEventArgs {Exception = exception});
        }
        catch (Exception exception)
        {
            logger.Error("HubWinClient connection to HubHost exception...", exception);
            HubConnectionError(this, new MyEventArgs {Exception = exception});
        }
    }

    public void DisconnectFromHub()
    {
        connection.Stop();
    }


    /// <summary>
    ///     when hub notifier connected to hub, hub invoke this method to inform connection success.
    /// </summary>
    public void joined()
    {
        var liveControlInfo = new LiveControlInfo
        {
            LiveControlType = LiveControlType.mainClient
        };
        // myHub.Invoke("AddLiveControl", liveControlInfo).Wait();
        // logger.Info("HubWinClient joined");
        ConnectedToHub(this, new EventArgs());
    }

    /// <summary>
    ///     when hub notifier reconnected to hub, hub invoke this method to inform reconnection success.
    /// </summary>
    public void rejoined()
    {
        logger.Info("HubWinClient rejoined");

    }

    /// <summary>
    ///     when hub notifier disconnect from hub, hub invoke this method to inform disconnection.
    /// </summary>
    public void leaved()
    {
        logger.Info("HubWinClient disconnected");
        DisonnectedFromHub(this, new EventArgs());
    }


    public void addData(LogMessage logMessage)
    {

        DataRecivedFromHub(this, logMessage);
    }

    public event EventHandler<LogMessage> OnSendingLogToHub = delegate { };

    /// <summary>
    ///     called by HubClientMoudle when it's ApplyLogReceived are invoked by WCF service
    /// </summary>
    /// <param name="logMessage"></param>
    public void SendToHub(LogMessage logMessage)
    {

        OnSendingLogToHub(this, logMessage);
        if (!moduleStarted) return;

        if (connection.State != ConnectionState.Connected)
            ConnectToHub(true);
        if (connection.State == ConnectionState.Connected)
        {
            if (System.Diagnostics.Debugger.IsAttached ||
                Math.Abs((logMessage.Log.ArrivalDateTime - DateTime.Now).Ticks) < TimeSpan.FromMinutes(10).Ticks)
            {
                try
                {
                    Task task = myHub.Invoke("send", logMessage);
                    task.Wait(5000);
                    logger.Debug("Send log success");
                    HubInvokeSuccess(this, new EventArgs());
                }

                catch (AggregateException aggregateException)
                {
                    Exception exception = aggregateException.InnerException;
                    logger.Error("Send log Exceotion!", exception);
                    HubInvokeError(this, new MyEventArgs {Exception = exception});
                }
                catch (Exception exception)
                {
                    logger.Error("Send log Exceotion!", exception);
                    HubInvokeError(this, new MyEventArgs {Exception = exception});
                }
            }
            else
            {
                logger.Warn("Log arrival date time is not less than DateTime.Now+30 minutues");
            }
        }

        else
        {
            logger.Warn("HubWinClient not connected to send log");
            NotConnectedToSentLog(this, new EventArgs());
        }
    }

    /// <summary>
    ///     when Hub receives log from HubWinClient, calls this method to inform send success
    /// </summary>
    /// <param name="log"></param>
    public void LogSentToWeb(int logId)
    {
        logger.Debug("Call back from Hub: send success");
        LogSentToHub(this, logId);
    }
}

这是我的测试:

    [Category("Integration")]
public class HubWinClientTests
{
    [Test]
    public void TestConnection()
    {
        //arrange
        const int port = 4000;
        HubHost hubHost = new HubHost(port);
        HubWinClient hubWinClient = new HubWinClient(port,"mvc app client");

        bool clientConnected = false;
        bool clientDisconnected = false;
        bool hubInvokeError = false;

        hubWinClient.ConnectedToHub += (sender, args) => { clientConnected = true; };
        hubWinClient.DisonnectedFromHub += (sender, args) => { clientDisconnected = true; };
        hubWinClient.HubInvokeError += (sender, args) => { hubInvokeError = true; };

        //act
        hubHost.Start();
        hubWinClient.Start();

        //assert
        var constrain = Is.True.After(10000, 100);
        Assert.That(() => clientConnected, constrain);

        //act
        hubWinClient.SendToHub(new LogMessage());

        //assert
        var constrain2 = Is.True.After(2000, 100);
        Assert.That(() => hubInvokeError == false, constrain2);

        // act
        hubWinClient.DisconnectFromHub();

        //  assert
        var constrain1 = Is.True.After(2000, 100);
        Assert.That(() => clientDisconnected, constrain1);

        hubHost.Stop();


    }
}

出于某种原因,当我通过resharper nunit runner运行我的测试时,hub实例确实创建了,我的测试失败了。我认为这与Resharper以及它如何创建测试环境(即流程创建和此类内容)有关。

任何想法。 感谢。

0 个答案:

没有答案