public async Task GetResponseAsync_NeverGetsAResponse_ThrowsTimeout()
        {
            // arrange
            var subscriber = new SubscriberFake();
            var handle     = new ResponseHandle <TestReply>(subscriber, ChannelName);

            // act

            // assert
            await Assert.ThrowsAsync <TimeoutException>(() =>
                                                        handle.GetResponseAsync().WithTimeout(TimeSpan.FromSeconds(2)));
        }
        public async Task GetResponseAsync_ReceivesResponse_Unblocks()
        {
            // arrange
            const string expected   = "foo";
            var          subscriber = new SubscriberFake();
            var          handle     = new ResponseHandle <TestReply>(subscriber, ChannelName);

            // act
            var simulationTask = Task.Run(async() =>
            {
                // simulates the delay in the reponse from the receiver
                var jsonData = JsonConvert.SerializeObject(new TestReply {
                    Prop = expected
                });
                await Task.Delay(1000);
                await subscriber.PublishAsync(ChannelName, jsonData);
            });
            var actual = await handle.GetResponseAsync().WithTimeout(TimeSpan.FromSeconds(5));

            // assert
            Assert.Equal(expected, actual.Prop);
        }