[NUnit 3] Как правильно проверить методы работы с базой данных? - C#
Формулировка задачи:
Здравствуйте.
Пишу приложение по работе с БД на базе MSSQL CE.
Написал библиотеку по работе с БД. Теперь решил попрактиковаться написанием Unit-тестов (и как оказалось не зря, т.к. нашел кучу ошибок).
Где:
ExecuteBatchCommand - пакетное исполнение SQL комманд
Оцените пожалуйста правильно ли сделал?
Подскажите как работать с проверкой исключений, в особеннсти интересует возможности провеки параметров исключения.
Пробовал так:
Проверка не проходит с ошибкой "!!Результат Сообщение: DataModel.SupportClasses.ExceptionHandler+SQLEntityException : Ошибка в приложении."
при этом
прекрсно работает, но как проверить содержимое исключения я не нашел.
И еще впрос: Как правильно проверить факт подключения к БД? Я проверяю это протым SELECT запросом, но правиьно ли это я не знаю.
Зарание спасибо.
Листинг программы
- [TestFixture]
- class LiteralTableSqlCeTest
- {
- string testData = "TestName";
- string testDataRename = "NewTestName";
- string testDataForDuplicate = "testDataForDuplicate";
- DatabaseProvider dbSQL;
- LiteralTableAbstract LTA;
- int _id;
- [OneTimeSetUp]
- public void BeforeTestSuit()
- {
- //Получение провайдера из фабрики и проверка типа провайдера
- dbSQL = DbProviderFactory.GetProvider(
- DataModel.DBWrapper.DBType.MSSQLCE,
- SQLCEParams.SQLCEConStirng
- );
- Assert.AreEqual(expected: typeof(SqlCeDbProvider), actual: dbSQL.GetType(),
- message: "Not Correct Provider expected:" + typeof(SqlCeDbProvider).Name
- + ", actual:" + dbSQL.GetType().Name);
- //Получение таблицы из фабрики и проверка типа таблицы
- LTA = dbSQL.GetLiteralTable();
- Assert.AreEqual(expected: typeof(LiteralTableSqlCe), actual: LTA.GetType(),
- message: "Not Correct Table expected:"+ typeof(LiteralTableSqlCe).Name
- + " actual:" + LTA.GetType().Name);
- //TODO Проверить факт подключения к БД и таблице
- //Подгатовка таблиц: удаление данных таблиц и сброс счетчиков
- LTA.ExecuteBatchCommand(SQLCEParams.DeleteAllFromTable1("Literal"));
- //Проверка что таблица пуста
- int i = LTA.GetEntities().Count;
- Assert.AreEqual(expected: 0, actual: i, message: "Literal table is not empty");
- }
- // Цель: Проверка добаления новой строки.
- // Предпологаемый результат: Удача
- [Test, Order(1)]
- public void LiteralTableSqlCe_AddNewData_Successful()
- {
- //Получение количества записей перед добавлением строки
- int numBeforeAdd = LTA.GetEntities().Count;
- //Добавления строки
- LTA.AddToDB(testData);
- //Получение данных из таблицы
- List<Literal> res = LTA.GetEntities();
- //Проверка факта добавления строки изходя из увеличения количества записей
- Assert.AreEqual(expected: 1, actual: res.Count - numBeforeAdd, message: "Row was not added");
- //Проверка, что данные занесены корректно
- bool RowContains = res.Count(p => p.Name.ToUpper() == testData.ToUpper()) > 0;
- Assert.AreEqual(expected: true, actual: RowContains, message: "Row data Error");
- _id = res[0].Id;
- }
- // Цель: Проверка добаления дуликата.
- // Предпологаемый результат: Получение исключения
- [Test, Order(2)]
- public void LiteralTableSqlCe_AddDuplicateData_CatachSqlCeException()
- {
- //!!ОШИБКА! Результат Сообщение:
- //DataModel.SupportClasses.ExceptionHandler+SQLEntityException : Ошибка в приложении.
- //Assert.That(LTA.AddToDB(testData), Throws.TypeOf<SQLEntityException>()
- //.With.Property("OperationType").EqualTo(DBOperationType.AddToDB)
- //);
- Assert.Throws<SQLEntityException>(() => LTA.AddToDB(testData));
- }
- // Цель: Проверка переименования строки.
- // Предпологаемый результат: Удача
- [Test, Order(3)]
- public void LiteralTableSqlCe_RenameInDB_Successful()
- {
- //Переименование testData в testDataRename
- LTA.RenameInDB(oldValue: testData, newValue: testDataRename, oldValueId: _id);
- //Получение данных из таблицы
- List<Literal> res = LTA.GetEntities();
- //Проверка изменения текста записи
- bool RowContains = res.Count(p => p.Name.ToUpper() == testDataRename.ToUpper()) > 0;
- Assert.AreEqual(expected: true, actual: RowContains, message: "Row was not renamed");
- }
- // Цель: Проверка переименованием дублируещимся значением.
- // Предпологаемый результат: Получение исключения
- [Test, Order(4)]
- public void LiteralTableSqlCe_RenameInDBDuplicate_CatachSqlCeException()
- {
- //Добавления строки с текстом testDataForDuplicate
- LTA.AddToDB(testDataForDuplicate);
- //Проверка добавления строки с текстом testDataForDuplicate
- List<Literal> res = LTA.GetEntities();
- bool RowContains = res.Count(p => p.Name.ToUpper() == testDataForDuplicate.ToUpper()) > 0;
- Assert.AreEqual(expected: true, actual: RowContains, message: "Row was not added");
- //Получения ID новой строки
- int dupid = (from n in res where (n.Name.ToUpper() == testDataForDuplicate.ToUpper()) select n.Id).First();
- //Плпытка переименования строки и проверко получения исключения
- Assert.Throws<SQLEntityException>(() =>
- LTA.RenameInDB(oldValue: testDataForDuplicate, newValue: testDataRename, oldValueId: dupid)
- );
- }
- // Цель: Проверка удаления строки.
- // Предпологаемый результат: Удача
- [Test, Order(5)]
- public void LiteralTableSqlCe_DeleteFromDB_Successful()
- {
- //Получение количества строк в таблице
- List<Literal> res = LTA.GetEntities();
- int i = res.Count;
- //Проверка наличия удаляемой строки
- bool RowContains = res.Count(p => p.Name.ToUpper() == testDataRename.ToUpper()) > 0;
- Assert.AreEqual(expected: true, actual: RowContains, message: "Row not found");
- //Удаление строки
- LTA.DeleteFromDB(testDataRename,_id);
- //Проверка удаления строки (количество записей уменьшилось на 1)
- res = LTA.GetEntities();
- Assert.AreEqual(expected: i-1, actual: res.Count, message: "Row was not deleted");
- //Проверка, что удалена строка с нужным тестом
- RowContains = res.Count(p => p.Name.ToUpper() == testDataRename.ToUpper()) > 0;
- Assert.False(RowContains);
- }
- [OneTimeTearDown]
- public void AfterTestSuit()
- {
- List<Literal> res;
- //Удаление данных таблиц и сброс счетчиков
- LTA.ExecuteBatchCommand(SQLCEParams.DeleteAllFromTable1("Literal"));
- //Проверка что таблица пуста
- res = LTA.GetEntities();
- Assert.AreEqual(expected: 0, actual: res.Count, message: "Table is not empty");
- }
- }
Листинг программы
- //
- Assert.That(LTA.AddToDB(testData), Throws.TypeOf<SQLEntityException>()
- .With.Property("OperationType").EqualTo(DBOperationType.AddToDB)
- );
Листинг программы
- Assert.Throws<SQLEntityException>(() => LTA.AddToDB(testData));
Решение задачи: «[NUnit 3] Как правильно проверить методы работы с базой данных?»
textual
Листинг программы
- var exception = Assert.Throws<SQLEntityException>(() => LTA.AddToDB(testData)); //Проходит
- Assert.AreEqual(exception.OperationType, DBOperationType.AddToDB);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д