public async Task TestExecuteAsync_DoesNotExecuteMethodFromSameThreadWhenRunningInSynchronizationContext()
#endif
        {
            var reader  = new Mock <IDataReader>();
            var command = new Mock <IDbCommand>();
            var ctx     = new TestSynchronizationContext();

            SynchronizationContext.SetSynchronizationContext(ctx);

            command.Setup(d => d.ExecuteReader())
            .Returns(reader.Object);

            reader.SetupGet(r => r.FieldCount)
            .Returns(1);

            var results = new[] { "Hello", ", ", "World!" };

            int index = -1;

            reader.Setup(r => r.Read())
            .Callback(() => ++ index)
            .Returns(() => index < results.Length);

            reader.Setup(r => r.GetName(0))
            .Returns("Id");
            reader.Setup(r => r.GetString(0)).Returns((int _) => results[index]);
            reader.Setup(r => r.GetFieldType(0)).Returns(typeof(string));

            var connection = new Mock <IDbConnection>();

            connection.Setup(c => c.CreateCommand())
            .Callback(() => ctx.Worker.Should().NotBeSameAs(Thread.CurrentThread, "Command called from the same thread as the reentrant Task."))
            .Returns(command.Object);

            var sp  = new StoredProcedure <InterfaceImpl>("foo");
            var res = await sp.ExecuteAsync(connection.Object);

            var idx = 0;

            foreach (var toTest in res)
            {
                toTest.ShouldBeEquivalentTo(new InterfaceImpl {
                    Id = results[idx++]
                });
            }

            SynchronizationContext.SetSynchronizationContext(null);
        }