【问题标题】:SignalR testing - how to mock groups in new version of SignalR for ASP.NET Core 2SignalR 测试 - 如何在新版 SignalR for ASP.NET Core 2 中模拟组
【发布时间】:2017-11-24 11:01:45
【问题描述】:

我尝试为我的 Hub 方法编写测试,但我不知道,因为当前 (1.0.0-alpha2-final) 版本的 SignalR 没有文档或代码示例。有我的代码:

[Fact]
public void SaveVisitorInfoTest()
{   
    //Arrange
    var chatHub = new ChatHub();
    var mockClients = new Mock<IHubClients>();
    chatHub.Clients = mockClients.Object;
    dynamic groups = new ExpandoObject();
    var groupName = "SomeConversation";
    string actualName = null;
    string expectedName = "someName";
    groups.SendVisitorInfo = new Action<string, string>(n => {
        actualName = n;
    });
    mockClients.Setup(_ => _.Group(groupName)).Returns(groups);

    //Act
    chatHub.Clients.Group(groupName).InvokeAsync("SendVisitorInfo", expectedName);

    // Assert
    Assert.Equal(expectedName, actualName);
}

Visual Studio 在运行测试时生成下一条错误消息:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException : 'Moq.Language.Flow.ISetup' 不包含“退货”的定义

在旧版本中,模拟客户端和组的创建如下所示:

var mockClients = new Mock<IHubCallerConnectionContext<dynamic>>();
dynamic groups = new ExpandoObject();
groups.SendVisitorInfo = new Action<string, string>(n => {
        actualName = n;
    });
mockClients.Setup(_ => _.Group(groupName)).Returns((ExpandoObject)groups)

但是我现在不能使用 IHubCallerConnectionContext,所以我尝试了:

var mockClients = new Mock<IHubClients>();

但我不知道在这种情况下如何创建模拟组

对不起我糟糕的英语

【问题讨论】:

  • 您的问题找到答案了吗?我也有同样的问题。
  • 我也在寻找这个答案。

标签: c# unit-testing mocking asp.net-core-2.0 asp.net-core-signalr


【解决方案1】:

我没有足够的代表发表评论,但这个链接是我能找到的测试 AspNetCore.SignalR v1.0.2 的最佳链接:

https://buildingsteps.wordpress.com/2018/06/12/testing-signalr-hubs-in-asp-net-core-2-1/

还是很丑。

我希望能够做到的是

public Task DoCallback(IHubContext<MyHub> hubContext)
{
   var clients = m_hubContext.Clients as IHubClients<IMyHubClient>;
   clients.Client( "one").myCallback("Hi!");
}

然后模拟如下:

var hubContext = new Mock<IHubContext<MyHub>>();
hubContext.Setup( h => h.Clients )
          .Returns( m_hubClients.Object );

var hubClients = new Mock<IHubClients>();

var clientCallbacks = new Mock<IMyHubClient>();

hubClients.As<IHubClients<IMyHubClient>>()
          .Setup( c => c.Client( "one" ) )
          .Returns( clientCallbacks.Object );

clientCallbacks.Setup( c => c.myCallback( It.IsAny<string>() ) )
               .Callback( ( stringp ) =>
              {
...etc...

希望在未来的版本中......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多