Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 信号员:使用moq框架模拟IHub并测试其方法_C#_Unit Testing_Signalr_Mstest_Signalr Hub - Fatal编程技术网

C# 信号员:使用moq框架模拟IHub并测试其方法

C# 信号员:使用moq框架模拟IHub并测试其方法,c#,unit-testing,signalr,mstest,signalr-hub,C#,Unit Testing,Signalr,Mstest,Signalr Hub,我尝试测试继承基类Hub()的自定义RepositoryHub。我模拟了IHub的所有必要属性和一个我想测试的his方法调用。方法调用被模拟为来自派生自定义类RepositoyHub的调用: hubMock.Setup(p=>p.OnConnected()).Returns(newrepositoryhub().OnConnected()) 问题是该方法无法访问模拟IHub字段 [TestMethod] public void Is_OnConnected_Successive_

我尝试测试继承基类Hub()的自定义RepositoryHub。我模拟了IHub的所有必要属性和一个我想测试的his方法调用。方法调用被模拟为来自派生自定义类RepositoyHub的调用:
hubMock.Setup(p=>p.OnConnected()).Returns(newrepositoryhub().OnConnected())

问题是该方法无法访问模拟IHub字段

    [TestMethod]
    public void Is_OnConnected_Successive_When_Instances_is_Absent_And_User_Authenticated()
    {
        try
        {
            var connectionId = "1";

            var request = new Mock<IRequest>();
            request.Setup(s => s.User.Identity.Name).Returns(user + "&" + server + "&" + password + "&" + level);
            request.Setup(s => s.User.Identity.IsAuthenticated).Returns(true);

            var mockClients = new Mock<IHubCallerConnectionContext>();
            var mockGroupManager = new Mock<IGroupManager>();
            var mockHubCallerContext = new Mock<HubCallerContext>(request.Object, connectionId);

            var hubMock = new Mock<IHub>(); 
            hubMock.Setup(p => p.Groups).Returns(mockGroupManager.Object);
            hubMock.Setup(p => p.Context).Returns(mockHubCallerContext.Object);
            hubMock.Setup(p => p.Clients).Returns(mockClients.Object);
            //Mock virtual method call
            hubMock.Setup(p => p.OnConnected()).Returns(new RepositoryHub().OnConnected()); 


            var r = hubMock.Object.OnConnected();
        }
        catch (Exception ex)
        {       
            throw;
        }
    }
       // Here method which i want to test with mocked IGroupManager, HubCallerContext and IHubCallerConnectionContext

    public partial class  RepositoryHub: Hub
    {
        public override Task OnConnected()
        {
            try
            {
                var userProfile = new UserProfile(Context.User); 
                //NullReference exception Context == null, but why i got it if mocked
                //HubCallerContext in test method

                Groups.Add(Context.ConnectionId, userProfile.ServerUrl);
                // and other useful actions 

                return base.OnConnected();
            }
            catch (Exception ex)
            {
                Log.TraceError(String.Format(" Hub: OnConnected() {0}", ex.Message));
                throw;
            }
        }
     }
[TestMethod]
当\u实例\u不存在\u且\u用户\u已验证()时,public void是\u OnConnected\u continued\u
{
尝试
{
var connectionId=“1”;
var request=newmock();
request.Setup(s=>s.User.Identity.Name)。返回(用户+“&”+服务器+“&”+密码+“&”+级别);
request.Setup(s=>s.User.Identity.IsAuthenticated)。返回(true);
var mockClients=new Mock();
var mockGroupManager=new Mock();
var mockHubCallerContext=new Mock(request.Object,connectionId);
var hubMock=new Mock();
Setup(p=>p.Groups).Returns(mockGroupManager.Object);
Setup(p=>p.Context).Returns(mockHubCallerContext.Object);
Setup(p=>p.Clients).Returns(mockClients.Object);
//模拟虚拟方法调用
Setup(p=>p.OnConnected()).Returns(newrepositoryhub().OnConnected());
var r=hubMock.Object.OnConnected();
}
捕获(例外情况除外)
{       
投掷;
}
}
//这里是我想用模拟的IGroupManager、HubCallerContext和IHubCallerConnectionContext测试的方法
公共部分类RepositoryHub:Hub
{
已连接的公用覆盖任务()
{
尝试
{
var userProfile=新的userProfile(Context.User);
//NullReference异常上下文==null,但为什么我在模拟时得到它
//测试方法中的HubCallerContext
添加(Context.ConnectionId、userProfile.ServerUrl);
//以及其他有益的行动
返回base.OnConnected();
}
捕获(例外情况除外)
{
Log.TraceError(String.Format(“Hub:OnConnected(){0}”,ex.Message));
投掷;
}
}
}


我找到了一条适合我的简单方法。谢谢大家的关注

            var repository = new RepositoryHub(){ Context = mockHubCallerContext.Object,
                                                  Clients = mockClients.Object,
                                                  Groups = mockGroupManager.Object };

            var r = repository.OnConnected();
对于JohnB,请回答最后一个问题:

[TestMethod]
public void Is_OnConnected_Successive()
{
    const string connectionId = "1";
    dynamic groupName = new ExpandoObject();

    var IsSendMessageCalled = false;

    groupName.sendMessage = new Action<object>((message) =>
    {
        IsSendMessageCalled = true;
        Debug.WriteLine("sendMessage was called, message:  {0}", message);
    });

    var request = new Mock<IRequest>();
    request.Setup(s => s.User.Identity.Name).Returns(user + "&" + server + "&" + password + "&" + level);
    request.Setup(s => s.User.Identity.IsAuthenticated).Returns(true);

    var mockClients = new Mock<IHubCallerConnectionContext>();
    mockClients.Setup(m => m.Group("groupName")).Returns((ExpandoObject)groupName);

    var mockGroupManager = new Mock<IGroupManager>();
    var mockHubCallerContext = new Mock<HubCallerContext>(request.Object, connectionId);

    var hub = new RepositoryHub()
    {
        Context = mockHubCallerContext.Object,
        Clients = mockClients.Object,
        Groups = mockGroupManager.Object
    };

    var testMethod = hub.OnConnected();
    Thread.Sleep(threadSleepTime);
    //or testMethod.Wait();

    Assert.IsTrue(IsSendMessageCalled);
}

嗨:我发现你的帖子和回答很有启发性。我遇到了一个额外的问题。我遵循你的模式。我很难从我的模拟组发送消息。因此,以下调用:Clients.Group(groupName).sendMessage(message)失败,因为Clients.Group()调用返回null。您是否遇到过此问题,或者有任何解决此问题的方法?谢谢@你好!是的。我为你的问题添加了答案,谢谢你提供更多信息。这绝对有用。我发现自己希望signar库本身更开放一些,这样我就可以在单元测试期间直接看到客户机和组集合进行调查。我希望能够建立一个涉及多个集线器和客户端的单元测试。你有这方面的经验吗?我将写一篇新的文章,对其进行重新分类。再次感谢@JohnB信号器是开放的,您可以在这里下载源代码。我没有测试多个集线器的经验,但我无法想象在您的过程中会遇到任何问题。如果您需要相同的设置,您已经有了它(即模拟组、客户端、上下文)。什么会阻止您创建另一个集线器类型实例并分配相同的模拟设置?我下载了信号源。我没有看到任何有助于解决在同一模拟中心上进行单元测试/模拟多个客户机/连接的问题。按照我模拟HubCallerContext(hub.Context)的方式,它与单个连接实例相关联。
public override Task OnConnected()
{
    Hub.Clients.Group("groupName").sendMessage("Hello ! for groupName group ");
}