[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);