[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);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д