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); }