gpt4 book ai didi

c# - 我应该如何在 Controller 中模拟 SignalR HubContext 以进行单元测试?

转载 作者:太空狗 更新时间:2023-10-29 21:57:49 25 4
gpt4 key购买 nike

我在 MVC5 项目中使用 SignalR。我在这样的 Controller 内进行调用:

private Microsoft.AspNet.SignalR.IHubContext blogHubContext = Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext<BlogHub>();
blogHubContext.Clients.All.addNewBlogToPage(RenderPartialViewToString("Blog", model));

我正在尝试对该 Controller 中的操作进行单元测试。在我添加 SignalR 功能之前,单元测试工作正常。现在我正在尝试弄清楚如何模拟 HubContext。我有 2 种可能性。

  1. 我在构造函数中设置了集线器,所以我有如下内容:

    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 并将其发送到 Controller 。到目前为止,我只有这个:

    Mock<IHubContext> blogHub = new Mock<IHubContext>();

    (注意:我已经简化了一切,只关注事物的 SignalR 方面。 Controller 等中也使用了存储库)

  2. 或者,我考虑过创建另一个类来包装集线器,然后仅从中调用函数来调用集线器。我认为这更容易模拟我的单元测试,但不确定这是否是个好主意。

方向表示赞赏。或者两者都是可以接受的前进方式?谢谢。

最佳答案

更新,请查看这段代码,我基于默认的 MVC 模板。不需要包装类。

public class HomeController : Controller
{
private readonly IHomeHub _hub;

public HomeController(IHomeHub hub)
{
_hub = hub;
}

public ActionResult Index()
{
_hub.Hello();
return View();
}
}

public interface IHomeHub
{
void Hello();
}

public class HomeHub : Hub, IHomeHub
{
public void Hello()
{
Clients.All.hello();
}
}

单元测试:

[TestMethod]
public void Index()
{
var mockHub = new Mock<IHomeHub>();
// Arrange
HomeController controller = new HomeController(mockHub.Object);

// Act
ViewResult result = controller.Index() as ViewResult;

// Assert
Assert.IsNotNull(result);
mockHub.Verify(h=>h.Hello(), Times.Once);
}

关于c# - 我应该如何在 Controller 中模拟 SignalR HubContext 以进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com