[NUnit 3] Как правильно проверить методы работы с базой данных? - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Пишу приложение по работе с БД на базе MSSQL CE. Написал библиотеку по работе с БД. Теперь решил попрактиковаться написанием Unit-тестов (и как оказалось не зря, т.к. нашел кучу ошибок).
Листинг программы
  1. [TestFixture]
  2. class LiteralTableSqlCeTest
  3. {
  4. string testData = "TestName";
  5. string testDataRename = "NewTestName";
  6. string testDataForDuplicate = "testDataForDuplicate";
  7. DatabaseProvider dbSQL;
  8. LiteralTableAbstract LTA;
  9. int _id;
  10. [OneTimeSetUp]
  11. public void BeforeTestSuit()
  12. {
  13. //Получение провайдера из фабрики и проверка типа провайдера
  14. dbSQL = DbProviderFactory.GetProvider(
  15. DataModel.DBWrapper.DBType.MSSQLCE,
  16. SQLCEParams.SQLCEConStirng
  17. );
  18. Assert.AreEqual(expected: typeof(SqlCeDbProvider), actual: dbSQL.GetType(),
  19. message: "Not Correct Provider expected:" + typeof(SqlCeDbProvider).Name
  20. + ", actual:" + dbSQL.GetType().Name);
  21. //Получение таблицы из фабрики и проверка типа таблицы
  22. LTA = dbSQL.GetLiteralTable();
  23. Assert.AreEqual(expected: typeof(LiteralTableSqlCe), actual: LTA.GetType(),
  24. message: "Not Correct Table expected:"+ typeof(LiteralTableSqlCe).Name
  25. + " actual:" + LTA.GetType().Name);
  26. //TODO Проверить факт подключения к БД и таблице
  27. //Подгатовка таблиц: удаление данных таблиц и сброс счетчиков
  28. LTA.ExecuteBatchCommand(SQLCEParams.DeleteAllFromTable1("Literal"));
  29. //Проверка что таблица пуста
  30. int i = LTA.GetEntities().Count;
  31. Assert.AreEqual(expected: 0, actual: i, message: "Literal table is not empty");
  32. }
  33. // Цель: Проверка добаления новой строки.
  34. // Предпологаемый результат: Удача
  35. [Test, Order(1)]
  36. public void LiteralTableSqlCe_AddNewData_Successful()
  37. {
  38. //Получение количества записей перед добавлением строки
  39. int numBeforeAdd = LTA.GetEntities().Count;
  40. //Добавления строки
  41. LTA.AddToDB(testData);
  42. //Получение данных из таблицы
  43. List<Literal> res = LTA.GetEntities();
  44. //Проверка факта добавления строки изходя из увеличения количества записей
  45. Assert.AreEqual(expected: 1, actual: res.Count - numBeforeAdd, message: "Row was not added");
  46. //Проверка, что данные занесены корректно
  47. bool RowContains = res.Count(p => p.Name.ToUpper() == testData.ToUpper()) > 0;
  48. Assert.AreEqual(expected: true, actual: RowContains, message: "Row data Error");
  49. _id = res[0].Id;
  50. }
  51. // Цель: Проверка добаления дуликата.
  52. // Предпологаемый результат: Получение исключения
  53. [Test, Order(2)]
  54. public void LiteralTableSqlCe_AddDuplicateData_CatachSqlCeException()
  55. {
  56. //!!ОШИБКА! Результат Сообщение:
  57. //DataModel.SupportClasses.ExceptionHandler+SQLEntityException : Ошибка в приложении.
  58. //Assert.That(LTA.AddToDB(testData), Throws.TypeOf<SQLEntityException>()
  59. //.With.Property("OperationType").EqualTo(DBOperationType.AddToDB)
  60. //);
  61. Assert.Throws<SQLEntityException>(() => LTA.AddToDB(testData));
  62. }
  63. // Цель: Проверка переименования строки.
  64. // Предпологаемый результат: Удача
  65. [Test, Order(3)]
  66. public void LiteralTableSqlCe_RenameInDB_Successful()
  67. {
  68. //Переименование testData в testDataRename
  69. LTA.RenameInDB(oldValue: testData, newValue: testDataRename, oldValueId: _id);
  70. //Получение данных из таблицы
  71. List<Literal> res = LTA.GetEntities();
  72. //Проверка изменения текста записи
  73. bool RowContains = res.Count(p => p.Name.ToUpper() == testDataRename.ToUpper()) > 0;
  74. Assert.AreEqual(expected: true, actual: RowContains, message: "Row was not renamed");
  75. }
  76. // Цель: Проверка переименованием дублируещимся значением.
  77. // Предпологаемый результат: Получение исключения
  78. [Test, Order(4)]
  79. public void LiteralTableSqlCe_RenameInDBDuplicate_CatachSqlCeException()
  80. {
  81. //Добавления строки с текстом testDataForDuplicate
  82. LTA.AddToDB(testDataForDuplicate);
  83. //Проверка добавления строки с текстом testDataForDuplicate
  84. List<Literal> res = LTA.GetEntities();
  85. bool RowContains = res.Count(p => p.Name.ToUpper() == testDataForDuplicate.ToUpper()) > 0;
  86. Assert.AreEqual(expected: true, actual: RowContains, message: "Row was not added");
  87. //Получения ID новой строки
  88. int dupid = (from n in res where (n.Name.ToUpper() == testDataForDuplicate.ToUpper()) select n.Id).First();
  89. //Плпытка переименования строки и проверко получения исключения
  90. Assert.Throws<SQLEntityException>(() =>
  91. LTA.RenameInDB(oldValue: testDataForDuplicate, newValue: testDataRename, oldValueId: dupid)
  92. );
  93. }
  94. // Цель: Проверка удаления строки.
  95. // Предпологаемый результат: Удача
  96. [Test, Order(5)]
  97. public void LiteralTableSqlCe_DeleteFromDB_Successful()
  98. {
  99. //Получение количества строк в таблице
  100. List<Literal> res = LTA.GetEntities();
  101. int i = res.Count;
  102. //Проверка наличия удаляемой строки
  103. bool RowContains = res.Count(p => p.Name.ToUpper() == testDataRename.ToUpper()) > 0;
  104. Assert.AreEqual(expected: true, actual: RowContains, message: "Row not found");
  105. //Удаление строки
  106. LTA.DeleteFromDB(testDataRename,_id);
  107. //Проверка удаления строки (количество записей уменьшилось на 1)
  108. res = LTA.GetEntities();
  109. Assert.AreEqual(expected: i-1, actual: res.Count, message: "Row was not deleted");
  110. //Проверка, что удалена строка с нужным тестом
  111. RowContains = res.Count(p => p.Name.ToUpper() == testDataRename.ToUpper()) > 0;
  112. Assert.False(RowContains);
  113. }
  114. [OneTimeTearDown]
  115. public void AfterTestSuit()
  116. {
  117. List<Literal> res;
  118. //Удаление данных таблиц и сброс счетчиков
  119. LTA.ExecuteBatchCommand(SQLCEParams.DeleteAllFromTable1("Literal"));
  120. //Проверка что таблица пуста
  121. res = LTA.GetEntities();
  122. Assert.AreEqual(expected: 0, actual: res.Count, message: "Table is not empty");
  123. }
  124. }
Где: ExecuteBatchCommand - пакетное исполнение SQL комманд Оцените пожалуйста правильно ли сделал? Подскажите как работать с проверкой исключений, в особеннсти интересует возможности провеки параметров исключения. Пробовал так:
Листинг программы
  1. //
  2. Assert.That(LTA.AddToDB(testData), Throws.TypeOf<SQLEntityException>()
  3. .With.Property("OperationType").EqualTo(DBOperationType.AddToDB)
  4. );
Проверка не проходит с ошибкой "!!Результат Сообщение: DataModel.SupportClasses.ExceptionHandler+SQLEntityException : Ошибка в приложении." при этом
Листинг программы
  1. Assert.Throws<SQLEntityException>(() => LTA.AddToDB(testData));
прекрсно работает, но как проверить содержимое исключения я не нашел. И еще впрос: Как правильно проверить факт подключения к БД? Я проверяю это протым SELECT запросом, но правиьно ли это я не знаю. Зарание спасибо.

Решение задачи: «[NUnit 3] Как правильно проверить методы работы с базой данных?»

textual
Листинг программы
  1. var exception = Assert.Throws<SQLEntityException>(() => LTA.AddToDB(testData)); //Проходит
  2. Assert.AreEqual(exception.OperationType, DBOperationType.AddToDB);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут