Russian Qt Forum
Ноябрь 24, 2024, 18:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите написать тест!  (Прочитано 5956 раз)
ІГРОГРАЙКО
Гость
« : Апрель 24, 2013, 17:19 »

Не могу никак придумать тест.

надо протестировать класс, экземпляр которого являет собой закачку (DownloadMember).
у класса есть всего 3 публичных метода:
Код:
    void startDownloading();
    void pauseDownloading();
    void deleteDownload();
и много Get-методов:
Код:
    int getState() const;
    QString getFileName() const;
    QString getDestination() const;
    qint64 getSpeed() const;
    qint64 getFileSize() const;
    QTime getTimeToFinish() const;
    qreal getProgress() const;

Проблема для меня заключается в том что я не знаю как подготовить екземпляр класса для тестирования на нем одного с 3-ех методов (void startDownloading(); например)
мой тест выглядит так:
Код:
void TestDownloadManager::downloadMember_startDownloading_Test()
{
    DownloadMember downloadMember = DownloadMember("http://test.txt", QDir::currentPath());
    downloadMember.startDownloading();

    QVERIFY(downloadMember.getState() == DownloadMember::Downloading);
}
но он никогда не будет работать потому, что конструктор DownloadMember требует реального URL, потому, что делает проверку сразу в конструкторе.
Правильно будет переопределить конструктор DownloadMember? Что для этого надо?

Вот код конструктора:
Код:
DownloadMember::DownloadMember(const QString &sourceURL, const QString &directory, QObject *parent) :
    QObject(parent)
{
    QUrl source = QUrl(sourceURL);
    fileName = source.path().split('/').last();
    destination = directory;
    timeToFinish = QTime();
    PART_SIZE = 4000000;
    bytesDownloaded = 0;
    currentPartSize = 0;
    fileSize = 0;
    progress = 0;
    speed = 0;
    currentState = NotReady;

    sender = QSharedPointer<Sender>(new Sender(source,this));
    speedCounter = QSharedPointer<SpeedCounter>(new SpeedCounter(this));

    connect(sender.data(), SIGNAL(newReply(QNetworkReply*)), SLOT(replyRecivingStarted(QNetworkReply*)));
    connect(speedCounter.data(), SIGNAL(speedChanged(qint64)), SLOT(speedChanged(qint64)));

    sender->getDownloadInfo();

    qDebug() << "(DownloadMember)Initialisation - completted";
}
Записан
mutineer
Гость
« Ответ #1 : Апрель 24, 2013, 17:25 »

А где в конструкторе проверка?
Записан
ІГРОГРАЙКО
Гость
« Ответ #2 : Апрель 24, 2013, 17:33 »

Код:
sender->getDownloadInfo();
Отправляет HEAD запрос по заданному URL. А потом коннект:
Код:
connect(sender.data(), SIGNAL(newReply(QNetworkReply*)), SLOT(replyRecivingStarted(QNetworkReply*)));
передает реплай в приватный слот класа, ну и там где то вылетает:
Код:
error(QNetworkReply::NetworkError)
после такого startDownloading() не сможет запустить закачку... Грустный
Записан
ІГРОГРАЙКО
Гость
« Ответ #3 : Апрель 24, 2013, 17:38 »

Кстати!
Сам метод startDownloading() выглядит так:
Код:
void DownloadMember::startDownloading()
{
    switch(currentState)
    {
    case NotReady:
        connect(this, SIGNAL(downloadIsReady()), SLOT(startDownloading()));
        return;
    case ReadyToStart:
        beginDownloading();
        return;
    case Pause:
        beginDownloading();
        return;
    default:
        qDebug() << "Unknown state...";
        return;
    }
}

и beginDownloading()
Код:
void DownloadMember::beginDownloading()
{
    sender->download("bytes=" + QByteArray::number(parts[0]) + "-" + QByteArray::number(parts[1]-1));
    speedCounter->start();
    currentState = Downloading;
    emit downloadDataChanged();
}
« Последнее редактирование: Апрель 24, 2013, 17:41 от ІГРОГРАЙКО » Записан
mutineer
Гость
« Ответ #4 : Апрель 24, 2013, 17:58 »

Чтобы нормально оттестировать это класс, имхо, придется понимать локальный сервер
Записан
ІГРОГРАЙКО
Гость
« Ответ #5 : Апрель 24, 2013, 18:12 »

ииииии...)
Не думаю что это хорошая идея запускать локал сервер...)

Наверное лучше будет перенести проверку в сам метод startDownloading()... Типа забарать с конструктора sender->getDownloadInfo(); и вставить его в:
Код:
void DownloadMember::startDownloading()
{
    switch(currentState)
    {
    case NotReady:
        // -УДАЛИТЬ!- connect(this, SIGNAL(downloadIsReady()), SLOT(startDownloading()));
        sender->getDownloadInfo();
        return;
    case ReadyToStart:
        beginDownloading();
        return;
    case Pause:
        beginDownloading();
        return;
    default:
        qDebug() << "Unknown state...";
        return;
    }
}
Записан
mutineer
Гость
« Ответ #6 : Апрель 24, 2013, 18:24 »

Так тебе надо протестить существующий класс или переписать его?
Записан
ІГРОГРАЙКО
Гость
« Ответ #7 : Апрель 24, 2013, 18:40 »

Мне нужно написать тесты для класса. Но можно переделать некоторые места для того чтобы было легче написать тесты...
Записан
mutineer
Гость
« Ответ #8 : Апрель 25, 2013, 11:28 »

Так а что даст перенос проверки в другой метод? Все равно без реального URL класс не пройдет тест
Записан
ІГРОГРАЙКО
Гость
« Ответ #9 : Апрель 25, 2013, 12:05 »

НУ походу тестирование метода startDownloading() можно понимать не как получение валидного ответа с сервера, а как мок, то есть вызов Qt-шного метода:
Код:
QNetworkAccessManager::get()
Ведь нет смысла тестировать результат Qt-шного метода? Он 100% работает должным образом...
« Последнее редактирование: Апрель 25, 2013, 12:31 от ІГРОГРАЙКО » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.049 секунд. Запросов: 21.