Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt 将Google测试与QNetworkAccessManager配合使用永远不会完成_Qt_Qt5_Signals Slots_Googletest_Qnetworkaccessmanager - Fatal编程技术网

Qt 将Google测试与QNetworkAccessManager配合使用永远不会完成

Qt 将Google测试与QNetworkAccessManager配合使用永远不会完成,qt,qt5,signals-slots,googletest,qnetworkaccessmanager,Qt,Qt5,Signals Slots,Googletest,Qnetworkaccessmanager,我正在尝试创建一个测试,该测试将使用QNetworkAccessManager与RESTful api进行对话。我只想使用QNetworkAccessManager获取一个简单的JSon对象。我的代码如下所示: Connection::Connection(QString常量和用户名、QString常量和密码、QString常量和url、QString常量和api): _用户(用户名),\u通行证(密码),\u url(url){ _manager=新的QNetworkAccessManager

我正在尝试创建一个测试,该测试将使用QNetworkAccessManager与RESTful api进行对话。我只想使用QNetworkAccessManager获取一个简单的JSon对象。我的代码如下所示:

Connection::Connection(QString常量和用户名、QString常量和密码、QString常量和url、QString常量和api):
_用户(用户名),\u通行证(密码),\u url(url){
_manager=新的QNetworkAccessManager(此);
QObject::connect(_管理器,信号(完成(QNetworkReply*)),此,插槽(ReceiverReply(QNetworkReply*));
QNetworkRequest请求;
setUrl(QUrl(_url.append(api));
request.setRawHeader(“Authorization”,QString(“Basic”).append(QString(“%1:%2”).arg(_user).arg(_pass)).toUtf8();
setHeader(QNetworkRequest::ContentTypeHeader,“text/json”);
QNetworkReply*reply=\u manager->get(请求);
}
无效连接::连接(QNetworkReply*reply){
//对回复做一些验证。。。
_data=QJsonDocument::fromJson(reply->readAll());
}
QJsonDocument连接::data()常量{
返回数据;
}
...
#包括
#包括“Connection.h”
#包括
测试(连接测试、创建){
int argc=0;
char*argv=0;
质量保证申请a(argc和argv);
连接*连接=新连接(“用户”,“abc123”,https://mytest.com/“,”api/”;
connect->deleteLater();
while(connect->data().isEmpty()){
//永远循环
}
}
最初我是通过让连接也成为QWidget进行测试的。只有在调用Connection->show()时,完成的信号才会显示;然后我必须手动关闭小部件并完成测试。但是,这对于自动单元测试来说并不是很有用

如果我使用上面的while循环等待_data设置为某个值,那么QNetworkAccessManager将永远不会发生任何事情,它将永远循环


在任何事情向前发展之前,是否需要进行一些调用?为什么->show()'正在工作?

您没有旋转事件循环,所以不要期望任何异步工作

您需要向
连接
类添加一个指示何时完成的信号,并使用该信号退出事件循环:

TEST(ConnectionTest, creation) {
    int argc = 0;
    char *argv = 0;
    QCoreApplication app(argc, &argv);
    // No need to allocate the connection on the heap!
    Connection connection("user", "abc123", "https://mytest.com/", "api/");
    QObject::connect(&connection, &Connection::finished, 
                     &app, &QCoreApplication::quit());
    app.exec();
}
您可以将
QApplication
实例添加为
ConnectionTest
类的成员

通过拥有
QNetworkAccessManager*manager
成员,也无需将堆分配的数量增加一倍。您可以将其作为常规成员:

class Connection : public QObject {
  Q_OBJECT
  QNetworkAccessManager manager;
  Q_SLOT void receiveReply(QNetworkReply *) { 
    ...
    emit finished();
  }
public:
  explicit
  Connection(const QString & user, const QString & password,
             const QUrl & url, const QString & path, 
             QObject * parent = 0) : QObject(parent) { ... }
  Q_SIGNAL void finished();
};