2017-10-02 8 views
0

Je suis en train de créer un test pour un cas d'utilisation comme ceci:QTest: tester les boîtes de dialogue avec les boîtes de dialogue sous

  • Une boîte de dialogue est ouvert
  • En cliquant sur un bouton dans cette boîte de dialogue ouvre un sous dialogue
  • en cliquant sur un bouton dans la boîte de dialogue sous le ferme
  • une action se fait dans le dialogue après le sous dialogue a été fermée

j'ai pu acte judiciaire e un test qui fait tout cela et organise les dialogues pour rendre ce test possible. Cependant, un problème étrange se produit: si ces étapes sont répétées plusieurs fois, l'action finale est répétée plus de fois que nécessaire. Pour simplifier, supposons que l'action génère des données d'entrée. Voici le motif répété:

  • exécuter le test avec des données "1" -> sortie est "1"
  • Execute test avec des données "1 2" -> sortie est "1 2 2"
  • Exécuter test avec données "1 2 3" -> sortie "1 2 2 3 3 3"
  • Exécuter le test avec les données "1 2 3 4" -> la sortie est "1 2 2 3 3 3 4 4 4 4"

Il semble que le signal d'action final soit répété, mais je n'ai pas réussi à trouver ce qui ne va pas avec le code. Voici un exemple de code simplifié qui reproduit la question:

test cas

void QtBugIsolationTest::testCase1() 
{ 
    auto dialog = new MyDialog(); 

    QTest::mouseClick(dialog->showSubDialogButton, Qt::LeftButton); 
    QTest::mouseClick(dialog->subDialog->button, Qt::LeftButton); 

    QTest::mouseClick(dialog->showSubDialogButton, Qt::LeftButton); 
    QTest::mouseClick(dialog->subDialog->button, Qt::LeftButton); 

    QTest::mouseClick(dialog->showSubDialogButton, Qt::LeftButton); 
    QTest::mouseClick(dialog->subDialog->button, Qt::LeftButton); 

    QVERIFY(true); 
} 

dialogue principal

MyDialog::MyDialog() 
{ 
    setGeometry(0, 0, 100, 100); 

    subDialog = new MySubDialog(this); 
    showSubDialogButton = new QPushButton(this); 
    connect(showSubDialogButton, SIGNAL(clicked()), this, SLOT(OnShowSub())); 
} 

MyDialog::~MyDialog() 
{ 
    delete showSubDialogButton; 
} 

void MyDialog::OnShowSub() 
{ 
    connect(subDialog, SIGNAL(accepted()), this, SLOT(OnCloseSub())); 
    subDialog->show(); 
} 

void MyDialog::OnCloseSub() 
{ 
    std::cout << "Closed sub dialog" << std::endl; 
    subDialog->hide(); 
    disconnect(subDialog);//, SIGNAL(accepted())); 
} 

Sous dialogue

MySubDialog::MySubDialog(QWidget* parent) : QDialog(parent) 
{ 
    setGeometry(0, 0, 100, 100); 

    button = new QPushButton(this); 
    connect(button, SIGNAL(clicked()), this, SLOT(OnPush())); 

    auto layout = new QHBoxLayout(); 
    layout->addWidget(button); 
    setLayout(layout); 
} 

MySubDialog::~MySubDialog() 
{ 
    delete button; 
} 

void MySubDialog::OnPush() 
{ 
    std::cout << "Button Pushed" << std::endl; 
    accepted(); 
} 

Si demandé (et possible dans StackOverflow), je peux poster l'ensemble du projet QtCreator ou des fichiers d'en-tête pour ces classes.

Répondre

0

J'ai finalement découvert le problème. C'était avec l'instruction disconnect() qui ne fonctionnait pas. Changer à partir

disconnect(subDialog); 

à

subDialog->disconnect(); 

résolu la question.