public async Task TransactionManager_ShouldCallCommitOnSuccessfulAsyncInvocation()
        {
            var mockTransaction = new Mock <IDbTransaction>(MockBehavior.Strict);

            mockTransaction.Setup(tr => tr.Commit());
            mockTransaction.Setup(tr => tr.Dispose());

            var mockDbConnection = new Mock <IDbConnection>(MockBehavior.Strict);

            mockDbConnection
            .Setup(conn => conn.BeginTransaction(IsolationLevel.Unspecified))
            .Returns(mockTransaction.Object);

            var mockModule = new Mock <IModule>(MockBehavior.Strict);

            mockModule
            .Setup(m => m.DoSomethingAsync())
            .Returns(Task.FromResult(1));

            Type proxyType = ProxyGenerator <IModule, TransactionManager <IModule> > .GetGeneratedType();

            IModule module = (IModule)Activator.CreateInstance(proxyType, mockModule.Object, new Lazy <IDbConnection>(() => mockDbConnection.Object)) !;

            int result = await module.DoSomethingAsync();

            Assert.That(result, Is.EqualTo(1));

            mockDbConnection.Verify(conn => conn.BeginTransaction(IsolationLevel.Unspecified), Times.Once);
            mockTransaction.Verify(tr => tr.Commit(), Times.Once);
        }
        public void TransactionManager_ShouldNotCompleteUntilTheTransactionIsDone()
        {
            bool inTransaction = false;

            var mockTransaction = new Mock <IDbTransaction>(MockBehavior.Strict);

            mockTransaction
            .Setup(tr => tr.Commit())
            .Callback(() => Thread.Sleep(10));
            mockTransaction
            .Setup(tr => tr.Dispose())
            .Callback(() => inTransaction = false);

            var mockDbConnection = new Mock <IDbConnection>(MockBehavior.Strict);

            mockDbConnection
            .Setup(conn => conn.BeginTransaction(IsolationLevel.Unspecified))
            .Returns(() =>
            {
                inTransaction = true;
                return(mockTransaction.Object);
            });

            var mockModule = new Mock <IModule>(MockBehavior.Strict);

            mockModule
            .Setup(m => m.DoSomethingAsync())
            .Returns(async() =>
            {
                await Task.Delay(10);
                return(0);
            });

            Type proxyType = ProxyGenerator <IModule, TransactionManager <IModule> > .GetGeneratedType();

            IModule module = (IModule)Activator.CreateInstance(proxyType, mockModule.Object, new Lazy <IDbConnection>(() => mockDbConnection.Object)) !;

            for (int i = 0; i < 100; i++)
            {
                Assert.DoesNotThrowAsync(async() =>
                {
                    await module.DoSomethingAsync();
                    Assert.False(inTransaction);
                });
            }
        }