【发布时间】:2014-04-24 14:35:01
【问题描述】:
我在 MVC5 项目中使用 SignalR。我在控制器中这样调用:
private Microsoft.AspNet.SignalR.IHubContext blogHubContext = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<BlogHub>();
blogHubContext.Clients.All.addNewBlogToPage(RenderPartialViewToString("Blog", model));
我正在尝试对此控制器中的操作进行单元测试。在我添加 SignalR 功能之前,单元测试工作正常。现在我正在尝试研究如何模拟 HubContext。我有两种可能。
-
我在构造函数中设置了集线器,所以我有如下内容:
private Microsoft.AspNet.SignalR.IHubContext blogHubContext; public BlogController(Microsoft.AspNet.SignalR.IHubContext topicHub = null){ blogHubContext = (blogHub != null) ? blogHub : Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<BlogHub>(); }然后,当我在单元测试中创建它时,我可以以某种方式模拟 HubContext 并将其发送到控制器。到目前为止,我只有这个:
Mock<IHubContext> blogHub = new Mock<IHubContext>();(注意:我已经简化了所有内容,只专注于 SignalR 方面。控制器等中也使用了存储库)
另外,我考虑创建另一个类来包装集线器,然后只调用其中的函数来调用集线器。我认为这对我的单元测试来说更容易模拟,但不确定这是否是个好主意。
方向赞赏。或者两者都是可以接受的前进方式?谢谢。
【问题讨论】:
-
我更喜欢第一个选项,因为您不需要另外一层不添加任何功能的包装类。
-
@AD.Net 谢谢。在这种情况下,任何想法我可以如何去模拟我正在使用的功能的集线器。我一直在努力弄清楚如何去做,这让我想到了第二种选择。
-
你对 mocking 熟悉吗?模拟信号器集线器似乎与模拟其他任何东西差不多。
-
@BenAaronson 由于 addNewBlogToPage 函数实际上是一个由 SignalR 调用的 JS 函数,我不知道如何去模拟它。但是,现在遵循 AD.Net 的建议,可能会将事情重新设计成更好的结构。
-
@AndrewPolland,js 函数将基于您的 .net 代码,因此对于 js 代理生成应该没什么大不了的。
标签: c# unit-testing signalr moq asp.net-mvc-5