Я думаю, что у нас есть все интерфейсы (IDbConnection, IDbTransaction, IDbCommand и IDbDataAdapter), чтобы смоделировать все методы, которые мы использовали, используя NSubstitute и Dependency Injection.
//using init class to inject IDbDataAdapter
IDbDataAdapter adapter = init.DbAdapter("command");
adapter.Connection = connection;
Что касается SqlConnection и SqlCommand
using (IDbConnection connection = init.DbConnection("connection"))
{
using (IDbTransaction transaction = connection.BeginTransaction())
{
using (IDbCommand command = init.DbCommand("sproc"))
{
command.Transaction = transaction;
command.Connection = connection;
...
}
}
}
Модульный тест будет выглядеть примерно так
//arrange
var connection = Substitute.For<IDbConnection>();
var command = Substitute.For<IDbCommand>();
var transaction = Substitute.For<IDbTransaction>();
//this is the init class used before
var init = Substitute.For<ISqlInitializer>();
connection.Open();
connection.BeginTransaction(Arg.Any<IsolationLevel>()).Returns(transaction);
init.DbConnection(Arg.Any<string>()).Returns(connection);
init.DbCommand(Arg.Any<string>()).Returns(command);
var client = new SqlClient(init);
//act
var result = await client.CommandMultipleAsync(new SqlConfiguration(FakeConnection, new List<string> { "testSproc1", "testSproc2" }));
//assert
Assert.AreEqual(0, result);
command.Received(2).ExecuteNonQuery();
transaction.Received(1).Commit();
Пожалуйста, ознакомьтесь с проверкой концепции проекта на GitHub для детального использования, а также с любыми предложениями или отзывами приветствуются: p https://github.com/TianyuanC/dals/blob/master/DALs.Sql/SqlClient.cs