Шаблон репозитория, NHibernate и модульное тестирование - PullRequest
0 голосов
/ 19 марта 2011

Я работаю над ASP MVC 3 PROJECT с шаблоном репозитория, я хочу знать, как именно нам нужно написать модульный тест для операций CRUD в репозитории (агрегат). Я застрял с сохранением части, где я хочу откат сохранить, удалить его из базы данных, что-то вроде Transaction.rollback, если я не работаю, может кто-нибудь помочь мне с примером кода, как это сделать.

Вот обзор моего кода

Begintransaction
session.save(Parent parent) in repository 
transaction.commit.

UnitTest:

opensession;
_rep.Save(parent);

На самом деле, если есть способ или фрагмент кода, который я могу вставить в часть TearDown в моем тестовом классе, которая запускается после каждого теста Скажите в mycase после метода Save и удаляет эту конкретную запись, и еще одну вещь, которая считается Я знаю, как это работает, когда он пытается сделать то же самое после других тестовых метидов (удалить, получить все) и т. д., я все в замешательстве.

Ответы [ 4 ]

1 голос
/ 19 марта 2011

Прежде всего, вы должны решить, хотите ли вы выполнить классический модульный тест или интеграционный тест с базой данных. Если вы хотите проверить свои сущности, вы должны использовать фальшивый или фиктивный репозиторий, который вы вставляете в свой тестовый класс (контейнер IOC был бы хорош). Следовательно, нет необходимости в откате (поскольку база данных не задействована). Если вы выполняете интеграционный тест, то я предлагаю вам использовать Sqlite в базе данных памяти. Это действительно легкий. Одна из проблем, связанных с Sqlite, заключается в том, что он не обеспечивает поддержку транзакций.

0 голосов
/ 05 июня 2017

В ваших методах NUnit Setup и TearDown вам нужно удалить и затем создать указанные таблицы (используя скрипт) в вашей базе данных.Поэтому до и после каждого из ваших тестов все ваши данные будут, конечно, удалены, оставляя для проверки только пустые таблицы.

В следующем примере используется база данных MySql, но даже для других баз данных код должен быть очень похожим:

public class DatabaseCleanup
    {
        private string _connectionString;
        private MySqlConnection _mySqlConnection;
        private string _filePath;
        public DatabaseCleanup()
        {
            _filePath = @"C:\createdatabase.sql";
            _connectionString = @"Server=localhost;Port=3306;Database=dbname;Uid=username;Password=password;";
            _mySqlConnection = new MySqlConnection(_connectionString);
        }

        public void Create()
        {
            string script = File.ReadAllText(_filePath);
            ExecuteScript(script);
        }

        private void ExecuteScript(string script)
        {
            try
            {
                MySqlCommand command = new MySqlCommand(script, _mySqlConnection);
                _mySqlConnection.Open();
                command.ExecuteNonQuery();
                _mySqlConnection.Close();
            }
            catch (Exception exception)
            {
                throw;
            }
            finally
            {
                _mySqlConnection.Close();
            }
        }
    }

Сценарий createdatabase.sql, упомянутый в приведенном выше коде, является просто файлом sql.который содержит таблицу удаления и создания табличных операторов, которые вы можете предоставить в соответствии с вашей базой данных.Ниже приведен лишь пример:

DROP TABLE IF EXISTS `my_table`;

CREATE TABLE `my_table` (
  `Id` varchar(50) NOT NULL,
  `Name` varchar(50) NOT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Затем вы можете использовать класс DatabaseCleanup в ваших тестовых классах NUnit для методов Setup и TearDown:

DatabaseCleanup databaseCleanup = new DatabaseCleanup();
databaseCleanup.Create();

Будьте осторожны, чтобы не запускать эту очистку базы данныхкод на производственных средах.Запускайте такие тесты только в среде разработки и тестирования.

PS Мне не нравятся люди, которые говорят здесь, использовать базы данных в памяти, такие как SqlLite.Это полностью противоречит цели тестирования интеграции.Это будет означать тестирование вашего кода с использованием другой базы данных в вашей среде разработки, а затем запуск и развертывание на другой платформе базы данных на рабочем сервере;а потом сталкиваюсь с кошмаром!

0 голосов
/ 19 марта 2011

Полагаю, вам нужен откат, чтобы поддерживать чистоту базы данных и избегать помех между тестами.Вы можете добиться этого, предоставляя собственную базу данных для каждого модульного теста.Есть хорошая статья о том, как добиться этого эффективным способом в Sql Server compact edition: http://www.differentpla.net/content/2009/03/using-sql-server-compact-edition-unit-testing.

РЕДАКТИРОВАТЬ: Некоторые примеры: http://nhdatabasescopes.codeplex.com/.

0 голосов
/ 19 марта 2011

Если вы хотите проверить доступ к своей базе данных, вы можете использовать базу данных в памяти, такую ​​как SQLite, для тестирования.Эта база данных исчезнет, ​​когда ваши тесты будут завершены, и вам не придется очищать тестовые данные.Другим преимуществом является скорость.В памяти БД намного быстрее, чем SQL Server и т. Д.

...