Вы должны придерживаться Разделение интерфейса и Принцип инверсии зависимости с помощью Инверсия управления с помощью Инъекция зависимости .
Таким образом, вы можете создать MockDB2Connection, который вы вставляете в конструктор, в своих модульных тестах, в то время как в своем реальном коде вы передаете правильный DB2Connection.
Предположим, у вас есть сервис, подобныйthis:
public class SomeService
{
private readonly IDbConnection _dbCOnnection;
public SomeService(IDbConnection dbConnection)
{
_dbCOnnection = dbConnection;
}
public async Task<IEnumerable<Foo>> GetFoos()
{
// Obviously don't do this in production code;
// just for demonstration purposes.
await _dbCOnnection.OpenAsync();
}
}
Вы можете реализовать классы Mock-соединения следующим образом:
public interface IDbConnection
{
Task OpenAsync();
// Other required methods...
}
public class ThrowingDbConnection : IDbConnection
{
public Task OpenAsync()
{
throw new Exception("...");
}
}
public class FakeDbConnection : IDbConnection
{
public Task OpenAsync()
{
return Task.CompletedTask;
}
}
Как контейнер IoC, у вас есть несколько вариантов.Microsoft. Microsoft.Extensions.DependencyInjection, AutoFac, CastleWindsor, Ninject и так далее.Выберите тот, который соответствует вашим потребностям.В большинстве случаев, Microsoft или AutoFac должны быть хорошим выбором здесь.