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

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

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

Здравствуйте. Пишу приложение по работе с БД на базе MSSQL CE. Написал библиотеку по работе с БД. Теперь решил попрактиковаться написанием Unit-тестов (и как оказалось не зря, т.к. нашел кучу ошибок).
[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");
    }
}
Где: ExecuteBatchCommand - пакетное исполнение SQL комманд Оцените пожалуйста правильно ли сделал? Подскажите как работать с проверкой исключений, в особеннсти интересует возможности провеки параметров исключения. Пробовал так:
//
Assert.That(LTA.AddToDB(testData), Throws.TypeOf<SQLEntityException>()
    .With.Property("OperationType").EqualTo(DBOperationType.AddToDB)
    );
Проверка не проходит с ошибкой "!!Результат Сообщение: DataModel.SupportClasses.ExceptionHandler+SQLEntityException : Ошибка в приложении." при этом
Assert.Throws<SQLEntityException>(() => LTA.AddToDB(testData));
прекрсно работает, но как проверить содержимое исключения я не нашел. И еще впрос: Как правильно проверить факт подключения к БД? Я проверяю это протым SELECT запросом, но правиьно ли это я не знаю. Зарание спасибо.

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

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

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


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

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

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