c# – SignalR:使用moq框架模拟IHub并测试他的方法
发布时间:2020-12-16 02:01:30 所属栏目:百科 来源:网络整理
导读:我尝试测试继承基类Hub( implements IHub interface)的自定义RepositoryHub.我嘲笑了IHub的所有必要属性和我要测试的方法调用.方法调用被模仿为派生自定义类RepositoyHub的调用: hubMock.Setup(p = p.OnConnected()).返回(new RepositoryHub().OnConnected(
我尝试测试继承基类Hub(
implements IHub interface)的自定义RepositoryHub.我嘲笑了IHub的所有必要属性和我要测试的方法调用.方法调用被模仿为派生自定义类RepositoyHub的调用:
hubMock.Setup(p => p.OnConnected()).返回(new RepositoryHub().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; } } } 解决方法
我觉得这很简单.谢谢你的关注!
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,Groups = mockGroupManager.Object }; var testMethod = hub.OnConnected(); Thread.Sleep(threadSleepTime); //or testMethod.Wait(); Assert.IsTrue(IsSendMessageCalled); } 建议,在这里调用sendMessage(message)方法: public override Task OnConnected() { Hub.Clients.Group("groupName").sendMessage("Hello ! for groupName group "); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |