public async Task ConnectAsync_CalledFromMultipleSenders_ClientConnectedOnce() { var sender1 = new object(); var sender2 = new object(); var mqttClientConfig = new MqttClientConfig(); var mqttClient = Substitute.For <IMqttClient>(); mqttClient.ConnectAsync(Arg.Any <IMqttClientOptions>(), Arg.Any <CancellationToken>()) .ReturnsForAnyArgs(_ => Task.FromResult(new MqttClientAuthenticateResult())); var clientWrapper = new MqttClientWrapper( mqttClient, mqttClientConfig, Substitute.For <IBrokerCallbacksInvoker>(), Substitute.For <ISilverbackLogger>()); var task1 = clientWrapper.ConnectAsync(sender1); var task2 = clientWrapper.ConnectAsync(sender2); task2.Should().BeSameAs(task1); await task1; await mqttClient.Received(1).ConnectAsync( Arg.Any <IMqttClientOptions>(), Arg.Any <CancellationToken>()); await mqttClient.Received(1).ConnectAsync( mqttClientConfig.GetMqttClientOptions(), Arg.Any <CancellationToken>()); }