Мое окончательное решение основано на ответе Стаса Петрова. Я обернул вызов к DbContext.Database.ExecuteSqlRawAsync()
, используя интерфейс с классом, который добавляется к DI в Startup.ConfigureServices()
.
. Я создал следующий интерфейс и класс:
public interface IStoredProcedureExecutor
{
public Task<int> ExecuteSqlRawAsync(string sql, params object[] parameters);
}
public class StoredProcedureExecutor : IStoredProcedureExecutor
{
public ApplicationDbContext DbContext { get; }
public StoredProcedureExecutor(ApplicationDbContext dbContext)
{
DbContext = dbContext;
}
public Task<int> ExecuteSqlRawAsync(string sql, params object[] parameters)
{
return DbContext.Database.ExecuteSqlRawAsync(sql, parameters);
}
}
В моем Код из вопроса, я заменил этот вызов:
_ = await DbContext.Database.ExecuteSqlRawAsync(sql, p1, p2, p3, p4, p5, resultParam);
На это:
_ = await StoredProcedureExecutor.ExecuteSqlRawAsync(sql, p1, p2, p3, p4, p5, resultParam);
Затем в тестовом коде я создал этот класс, который я создаю, установить подходящий ReturnValue
, а затем вставьте в класс, который я тестирую, вместо StoredProcedureExecutor
:
class TestStoredProcedureExecutor : IStoredProcedureExecutor
{
public bool ReturnValue { get; set; }
public Task<int> ExecuteSqlRawAsync(string sql, params object[] parameters)
{
foreach (var param in parameters)
{
var p = (SqlParameter)param;
if (p.Direction == System.Data.ParameterDirection.Output) p.Value = ReturnValue;
}
return Task.FromResult(0);
}
}