Я тестирую с использованием sqlite. У меня другой подход.
Я позволил NH создать соединение, но сохранил его в статической переменной, чтобы передать его в последующие сеансы.
Когда я начал писать тестовый фреймворк, у меня был такой код инициализации:
static IDbConnection staticSqliteConnection;
if (staticSqlliteConnection == null)
{
sessionFactory.CreateSession().Connection;
}
Тогда у меня были некоторые проблемы, и у меня было слишком много тестового кода в моем рабочем коде (я предпочитаю не иметь его). Генераторы идентификаторов Hi-Lo также не работают, если вы передаете соединение сеансу.
Затем я написал класс ConnectionProvider, похожий на этот:
public class SingleConnectionProvider : DriverConnectionProvider
{
private static IDbConnection staticConnection = null;
public static void ResetConnection()
{
if (staticConnection == null) return;
staticConnection.Dispose();
staticConnection = null;
}
public override IDbConnection GetConnection()
{
if (staticConnection == null)
{
staticConnection = base.GetConnection();
}
if (staticConnection.State != ConnectionState.Open)
{
staticConnection.Open();
}
return staticConnection;
}
protected override void Dispose(bool isDisposing)
{
ResetConnection();
}
}
В методе очистки модульного теста вы вызываете SingleConnectionProvider.ResetConnection()
, который уничтожает базу данных для следующего теста.
Все это, конечно, не является полностью безопасным для потоков. Вы можете создать столько сеансов, сколько захотите, но вам следует избегать их одновременного создания.