如何模拟服务层中使用的SignalR

问题描述

我需要测试ClientConnectionProvider类,但是不能在下面给出的测试类中模拟private IHubContext<SignalrServerHub,IBroadcast> HubContext { get; set; }。如何在测试类中使用的hubcontext中模拟客户端?

public class ClientConnectionProvider : IConnectionProvider
{
    private readonly ILogger<ClientConnectionProvider> logger;
    
    private IHubContext<SignalrServerHub,IBroadcast> HubContext { get; set;}
    
    /// <summary>
    /// Initializes a new instance of the <see cref="ClientConnectionProvider"/> class.
    /// </summary>
    /// <param name="logger"></param>
    /// <param name="hubContext"></param>
    public ClientConnectionProvider(ILogger<ClientConnectionProvider> logger,IHubContext<SignalrServerHub,IBroadcast> hubContext)
    {
        this.logger = logger;
        HubContext = hubContext;
    }
    
    /// <summary>
    /// To create and save  a connection based on clients on connect.
    /// </summary>
    /// <param name="groupName"><see cref="string"/>.</param>
    /// <returns>Task of <see cref="Task"/>.</returns>
    public async Task<ServiceMethodResponse> SubscribeConnectionToAGroup(ClientConnection connection)
    {
        await HubContext.Groups.AddToGroupAsync(connection.ConnectionId,"HubUsers");
    
        return new ServiceMethodResponse() 
        {
            IsSuccess = true,IsValid = true,Message = "Subscribed to a group"
        };
    }
}

public class ConnectionProviderTest
{
    private Mock<ILogger<ClientConnectionProvider>> logger;
    private Mock<IDispatcher> dispatcher;
    private Mock<IServiceProvider> serviceProvider;
    private Mock<IConnectionProvider> connectionProvider;
    private Mock<IHubContext<SignalrServerHub,IBroadcast>> HubContext;
    //Mock<IClientProxy> mockClientProxy = new Mock<IClientProxy>();
    private Mock<IClientProxy> mockClientProxy = new Mock<IClientProxy>();    

    /// <summary>
    /// Initializes a new instance of the <see cref="ConnectionProviderTest"/> class.
    /// </summary>
    public ConnectionProviderTest()
    {
        this.logger = new Mock<ILogger<ClientConnectionProvider>>();
        this.HubContext = new Mock<IHubContext<SignalrServerHub,IBroadcast>>();
        this.connectionProvider = new Mock<IConnectionProvider>();
        this.dispatcher = new Mock<IDispatcher>();
    }

    [Fact]
    public async Task SendNotificationToAllFoundSuccess()
    {    
        Mock<IHubClients> mockClients = new Mock<IHubClients>();
        Mock<IClientProxy> mockClientProxy = new Mock<IClientProxy>();
        mockClients.Setup(clients => clients.All).Returns(mockClientProxy.Object);
        ClientConnectionProvider clientConnectionProvider = new ClientConnectionProvider( this.logger.Object,this.HubContext.Object);

        this.HubContext.Setup(x => x.Clients).Returns(() => (IHubClients<IBroadcast>)mockClients.Object);

        NotificationPayload payload = new NotificationPayload
        {
            Message = "RnadomHashString",SubscriptionTypes = new List<SubscriptionType>() { new SubscriptionType { SubscriptionTypeName = "HubUsers" } },};

        ServiceMethodResponse response = await clientConnectionProvider.SendNotificationToAll(payload).ConfigureAwait(true);
        Assert.True(response.IsValid);
    }
}

如何测试ClientConnectionProvider的方法?发生错误System.InvalidCastException:无法将类型为'Castle.Proxies.IHubClients`1Proxy'的对象转换为类型为'Microsoft.AspNetCore.SignalR.IHubClients`1[Platform.PushNotification.Services.SignalRHub.IBroadcast]'的对象。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)