问题描述
我目前正在建立一个单元测试帮助程序类,该类在Qt中使用C ++ 11进行验证,以验证在不知其顺序的测试过程中是否发出了信号,例如:
void TestUtils::verifyVolumeAdjustment(const QSignalSpy &vol_spy,uint percent)
{
for(QList<QVariant> vol_call_args : vol_spy){
if(vol_call_args.at(0).toInt() == percent)
{
return;
}
}
QString err = QString("volume never set to %1").arg(QString::number(percent));
QFAIL(err.toLocal8Bit().constData());
}
我有很多这样的功能,用于检查是否发出了某些信号。现在,我需要在顺序很重要的地方编写测试。在这些测试中,我需要验证例如:
Volume set to 10
Volume set to 50
但完全按此顺序。现在我的问题是,是否可以使用可变参数模板或类似的方法将函数调用列表传递给函数。我想象通用顺序检查功能是这样的:
void checkExecutionOrder(const QSignalSpy& spy,FunctionCallList call_list){
for(int i = 0; i < call_list.length(),i++){
QSignalSpy temp;
temp.append(spy.at(i)); //create a temporary copy of that caught signal to ensure its the only thing validated
call_list[i].call(temp,arguments); // call the function from the list with modified spy and remaining arguments
}
}
有什么好方法可以做到,所以我不必为每个函数创建一个顺序敏感的测试函数吗?
解决方法
另一个选择是使用lambda。 方法如下:
- 定义采用列表的方法,向量为
std::functions
- 在方法内部进行for循环并调用每个函数
- 调用该方法传递一个填充有lambda的向量,称为...
void myFooFunction(QVector<std::function<int(int)>>& myVec)
{
for(auto& x:myVec)
{
x(1);
}
}
int main(int argc,char* argv[])
{
QVector<std::function<int(int)>> x;
auto f1 = [](int x){qDebug() << "x ++" << x; return x++;};
auto f2 = [](int x){qDebug() << "x --" << x; return x--;};
x.push_back(f1);
x.push_back(f2);
myFooFunction(x);
,
您可以使用 SELECT o.*,(SELECT name FROM projects WHERE ProjectID = o.ProjectID) as Name
FROM orders o order by OrderID desc
INNER JOIN order_items oi ON oi.ORDERID = o.ORDERID
INNER JOIN order_acceptance_comments oac ON oac.ORDER_ID = o.ORDERID
WHERE order_item_id = 1
和std::vector
将具有相同签名的功能列表传递给std::function
:
checkExecutionOrder