Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit 215b929

Browse files
committed
Also handle async API throwing Exceptions
1 parent cf31b5b commit 215b929

File tree

2 files changed

+49
-6
lines changed

2 files changed

+49
-6
lines changed

src/ServiceStack.OrmLite/OrmLiteExecFilter.cs

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,20 @@ public virtual Task<T> Exec<T>(IDbConnection dbConn, Func<IDbCommand, Task<T>> f
105105
{
106106
var dbCmd = CreateCommand(dbConn);
107107

108-
return filter(dbCmd)
109-
.Then(t =>
110-
{
111-
DisposeCommand(dbCmd, dbConn);
112-
return t;
113-
});
108+
try
109+
{
110+
return filter(dbCmd)
111+
.Then(t =>
112+
{
113+
DisposeCommand(dbCmd, dbConn);
114+
return t;
115+
});
116+
}
117+
catch
118+
{
119+
DisposeCommand(dbCmd, dbConn);
120+
throw;
121+
}
114122
}
115123

116124
public virtual Task<IDbCommand> Exec(IDbConnection dbConn, Func<IDbCommand, Task<IDbCommand>> filter)

tests/ServiceStack.OrmLite.Tests/OrmLiteExecFilterTests.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Data;
33
using System.Linq;
4+
using System.Threading.Tasks;
45
using NUnit.Framework;
56
using ServiceStack.Common.Tests.Models;
67
using ServiceStack.OrmLite.Tests.Expression;
@@ -50,6 +51,23 @@ public override T Exec<T>(IDbConnection dbConn, System.Func<IDbCommand, T> filte
5051
throw;
5152
}
5253
}
54+
55+
public override Task<T> Exec<T>(IDbConnection dbConn, Func<IDbCommand, Task<T>> filter)
56+
{
57+
try
58+
{
59+
return base.Exec(dbConn, filter);
60+
}
61+
catch (Exception)
62+
{
63+
var sql = dbConn.GetLastSql();
64+
if (sql == "exec sp_name @firstName, @age")
65+
{
66+
return ((T)(object)new Person { FirstName = "Mocked" }).AsTaskResult();
67+
}
68+
throw;
69+
}
70+
}
5371
}
5472

5573
[TestFixture]
@@ -93,6 +111,23 @@ public void Can_mock_store_procedure()
93111
OrmLiteConfig.DialectProvider.ExecFilter = holdExecFilter;
94112
}
95113

114+
[Test]
115+
public async System.Threading.Tasks.Task Can_mock_store_procedure_Async()
116+
{
117+
var holdExecFilter = OrmLiteConfig.DialectProvider.ExecFilter;
118+
OrmLiteConfig.DialectProvider.ExecFilter = new MockStoredProcExecFilter();
119+
120+
using (var db = OpenDbConnection())
121+
{
122+
var person = await db.SqlScalarAsync<Person>("exec sp_name @firstName, @age",
123+
new { firstName = "aName", age = 1 });
124+
125+
Assert.That(person.FirstName, Is.EqualTo("Mocked"));
126+
}
127+
128+
OrmLiteConfig.DialectProvider.ExecFilter = holdExecFilter;
129+
}
130+
96131
[Test]
97132
public void Does_use_StringFilter()
98133
{

0 commit comments

Comments
 (0)