2017-10-20 54 views
0

Je travaille sur un projet Qt et je dois pouvoir écrire des tests unitaires pour les fonctions qui dépendent de QNetworkAccessManager.Test Qt en fonction du réseau

Google Mock semble être une surpuissance pour mes fins, et j'ai trouvé this réponse qui suggère d'utiliser un "truc de linker" pour se moquer de la classe. Cependant, je suis très nouveau en C++ (et C en général), et j'ai du mal à comprendre la façon exacte dont je suis censé utiliser cette "astuce". Suis-je censé changer manuellement le fichier d'en-tête pour exécuter le test, ou y a-t-il une meilleure façon de le faire (je suppose qu'il y a).

Tout type d'exemple sur la structure d'en-tête/code pour le faire correctement serait une aide immense.

Répondre

1

Vous pouvez utiliser des astuces de lieur, mais comme QNetworkAccessManager peut être sous-classé, vous trouverez peut-être plus simple de le faire.

Par exemple, si vous voulez faire une version qui ne se connectera pas, vous pouvez faire quelque chose comme:

class FailQNetworkAccessManager : public QNetworkAccessManager 
{ 
    Q_OBJECT 
public: 
    FailQNetworkAccessManager(QObject *parent = Q_NULLPTR):QNetworkAccessManager(parent){} 

protected: 
    QNetworkReply* createRequest(Operation op, const QNetworkRequest &originalReq, QIODevice *outgoingData = Q_NULLPTR) 
    { 
    QNetworkReply* rep = QNetworkAccessManager::createRequest(op, originalReq, outgoingData); 
    // Queue the abort to occur from main loop 
    QMetaObject::invokeMethod(req, "abort", Qt::QueuedConnection); 
    return rep; 
    } 
}; 

Ensuite, votre code de test peut fournir à votre classe au lieu FailQNetworkAccessManager que le vrai et toutes les demandes doivent être annulées dès qu'elles sont créées. (Ceci est juste un exemple de code, je n'ai pas encore essayé ce code - je vous recommande également de le partager en en-tête & fichiers cpp).

Vous devriez également jeter un oeil au système Qt Test, qui est le cadre de test intégré.