Это безопасно? - базовый класс NUnit открывает и откатывает TransactionScope - PullRequest
2 голосов
/ 02 декабря 2008

Я подумал, что было бы неплохо создать базовый класс для тестовых приборов NUnit, который открывает TransactionScope на этапе SetUp, а затем откатывает транзакцию во время завершения. Примерно так:

    public abstract class TestFixtureBase
{
    private TransactionScope _transaction;

    [TestFixtureSetUp]
    public void TestFixtureSetup()
    {
        _transaction = new TransactionScope();
    }

    [TestFixtureTearDown]
    public void TestFixtureTearDown()
    {
        if (_transaction != null)
        {
            _transaction.Dispose();
        }
    }
}

Как вы думаете, это хорошая идея?

Очевидно, что база данных - это просто тестовая база данных, а не живая база данных, но она все равно будет раздражать, если заполнится ненужными данными из модульных тестов.

Что делают другие люди, когда проводят модульные тесты, требующие большого количества доступа к данным?

Ответы [ 2 ]

4 голосов
/ 02 декабря 2008

Вы хотите быть осторожным здесь. TransactionScope собирается преобразовать транзакцию в распределенную транзакцию, если вы откроете более одного соединения с базой данных. Я считаю, что проще написать простой SQL-код, который очищает таблицы, представляющие интерес для моего тестового класса, прежде чем я начну выполнять тест.

РЕДАКТИРОВАТЬ: Обычно я бы назвал любой тест, который касается базы данных, интеграционным тестом, поскольку он включает в себя другую систему. Обычно я проверяю базу данных при модульном тестировании моего кода.

[TestSetup]
public void Setup()
{
   foreach (string table in new string[] { "table1", "table2" })
   {
        ClearTable( table );
   }
}

private void ClearTable( string table )
{
     ...standard stuff to set up connection...
     SqlCommand command = connection.CreateCommand() );
     command.CommandText = "delete from " + table;
     command.ExecuteNonQuery();
     ... stuff to clean up connection...
}
1 голос
/ 09 декабря 2008

Я использовал XtUnit Он автоматически откатывается в конце модульного теста. Вы можете просто добавить атрибут [Rollback] в тест. Это расширение для NUnit или MbUnit

...