在 Qt C++ 中测试 SQLite 数据库错误

问题描述 投票:0回答:1
// database.h

#ifndef DATABASE_H
#define DATABASE_H

// #include <QApplication>
// #include <QtSql>
// #include <QString>
#include <QSqlDatabase>

class DbManager
{
public:
    DbManager(const QString &path);
    bool isOpen() const;
    void close();
    bool addPerson(const QString &name, const QString &surname, const QString &age);
    bool deletePerson(const QString &name, const QString &surname);
    bool personExists(const QString &name, const QString &surname);
    bool printAllPersons() const;
    
    
private:
    QSqlDatabase m_db;
};

#endif // DATABASE_H


// database.cpp

#include "database.h"
#include <QDebug>
#include <QSqlError>
#include <QSqlQuery>
#include <QSqlRecord>

DbManager::DbManager(const QString &path)
{
    // Initialize the QSqlDatabase object with the provided path
    m_db = QSqlDatabase::addDatabase("QSQLITE");
    m_db.setDatabaseName(path);

    // Open the database     connection
    if (!m_db.open())
    {
        qDebug() << "Error: Failed to open database:" << m_db.lastError().text();
    }
    else
    {
        qDebug() << "Database: connection ok";
    }
}

bool DbManager::isOpen() const
{
    return m_db.isOpen();
}

void DbManager::close()
{
    m_db.close();
}

bool DbManager::addPerson(const QString &name, const QString &surname, const QString &age)
{
    bool success = false; 

    // Check if database is open
    if (isOpen())
    {
        QSqlQuery query;
        query.prepare("INSERT INTO people (name, surname, age) VALUES (:name, :surname, :age)");
        query.bindValue(":name", name);
        query.bindValue(":surname", surname);
        query.bindValue(":age", age);

        if (query.exec())
        {
            success = true;
        }
        else
        {
            qDebug() << "addPerson error:" << query.lastError();
        }
    }
    else
    {
        qDebug() << "Database is not open!";
    }

    return success;
}

bool DbManager::personExists(const QString &name, const QString &surname)
{
    bool exists = false;

    // Check if database is open
    if (isOpen())
    {
        QSqlQuery query;
        query.prepare("SELECT name, surname FROM people WHERE name = (:name) AND surname = (:surname)");
        query.bindValue(":name", name);
        query.bindValue(":surname", surname);

        if (query.exec())
        {
            if (query.next())
            {
                exists = true;
            }
        }
        else
        {
            qDebug() << "personExists error:" << query.lastError();
        }
    }
    else
    {
        qDebug() << "Database is not open!";
    }

    return exists;
}

bool DbManager::deletePerson(const QString &name, const QString &surname)
{
    bool success = false;

    // Check if database is open
    if (isOpen())
    {
        QSqlQuery query;
        query.prepare("DELETE FROM people WHERE name = (:name) AND surname = (:surname)");
        query.bindValue(":name", name);
        query.bindValue(":surname", surname);

        success = query.exec();

        if (!success)
        {
            qDebug() << "removePerson error:" << query.lastError();
        }
    }
    else
    {
        qDebug() << "Database is not open!";
    }

    return success;
}

bool DbManager::printAllPersons() const
{
    // Check if database is open
    if (isOpen())
    {
        QSqlQuery query("SELECT * FROM people");

        int idName = query.record().indexOf("name");
        int idSurname = query.record().indexOf("surname");
        int idAge = query.record().indexOf("age");

        while (query.next())
        {
            QString name = query.value(idName).toString();
            QString surname = query.value(idSurname).toString();
            QString age = query.value(idAge).toString();

            qDebug() << name << surname << age;
        }
    }
    else
    {
        qDebug() << "Database is not open!";
    }

    return true;
}

// test_db.h

#ifndef TEST_DB_H
#define TEST_DB_H

#include <QtTest/QtTest>
#include <QObject>

class TestDbManager : public QObject
{
    Q_OBJECT

private slots:
    void testAddPerson();
};

#endif // TEST_DB_H

// test_db.cpp

#include <QtTest/QtTest>
#include "database.h"
#include "test_db.h"

void TestDbManager::testAddPerson()
{
    DbManager manager("test.db");
    QVERIFY(manager.isOpen());

    QVERIFY(manager.addPerson("John", "Doe", "30"));
    QVERIFY(manager.personExists("John", "Doe"));

    QVERIFY(manager.addPerson("Jane", "Doe", "25"));
    QVERIFY(manager.personExists("Jane", "Doe"));

    QVERIFY(manager.addPerson("John", "Smith", "40"));
    QVERIFY(manager.personExists("John", "Smith"));

    // printing all persons
    QVERIFY(manager.printAllPersons());
}

// QTEST_MAIN(TestDbManager)

************ 开始测试TestDbManager ********* 配置:使用 QtTest 库 6.6.2、Qt 6.6.2(x86_64-little_endian-llp64 共享(动态)发布版本;由 GCC 11.2.0 提供)、Windows 10 通过:TestDbManager::initTestCase() QDEBUG : TestDbManager::testAddPerson() 数据库:连接正常 QDEBUG : TestDbManager::testAddPerson() addPerson 错误:QSqlError("", "参数计数不匹配", "")

失败! : TestDbManager::testAddPerson() 'manager.addPerson("John", "Doe", "30")' 返回 FALSE。 ()

..\untitled1 est_db.cpp(12) : 失败位置 通过:TestDbManager::cleanupTestCase() 总计:2 次通过,1 次失败,0 次跳过,0 次列入黑名单,12 毫秒 ********* TestDbManager 测试完成 *********

我被卡住了,我找不到该方法失败的原因。谁能发现发生了什么?

c++ sqlite qt qttest
1个回答
0
投票

尝试改变

QSqlQuery query;
    query.prepare("INSERT INTO people (name, surname, age) VALUES (?, ?, ?)");
    query.bindValue(0, name);
    query.bindValue(1, surname);
    query.bindValue(2, age);
© www.soinside.com 2019 - 2024. All rights reserved.