2016-08-09 11 views
1

У меня 2 вопроса:Как управлять QFileDialog с помощью Qt Test?

  1. Как я могу получить доступ к QFileDialog и записать путь к файлу в поле «Имя файла» с помощью модуля Qt Test?

    Я спрашиваю, потому что я разрабатываю некоторые тесты GUI в Qt, и теперь мне нужно открыть текстовый файл. Следующий код создает QFileDialog и получает путь к файлу:

    QString filePath = QFileDialog::getOpenFileName(
              this, 
              "Open", 
              "", 
              tr("Text Files (*.txt)")); 
    
  2. Если я использую нить (QThread) для загрузки содержимого в текстовом файле, как я могу ждать этого потока, чтобы закончить в моем GUI тесты?

    Я знаю, что могу использовать команду QTest::qSleep(milliseconds);, но я не думаю, что это хорошая практика в этом случае.

Если возможно, покажите мне пример.

+0

Вы имеете в виду модуль тестирования Qt, верно? –

+0

Да, модуль тестирования Qt. – KelvinS

ответ

1
  1. К сожалению, это невозможно с помощью модуля тестирования Qt. У вас есть несколько вариантов:

    1. Добавить контрольные крючки, которые обходят этот диалог: вам нужно измерить свой код, чтобы сделать его проверяемым. Вы можете, например, установите свойство testFile объекта, который запрашивает файл в пути к файлу, если свойство установлено, объект может пропустить запрос файла.

      const char k_testFile[] = "k_testFile"; 
      
      MyClass::foo() { 
          ... 
          auto testFile = property(k_testFile); 
          auto filePath = testFile.isNull() 
          ? QFileDialog::getOpenFilePath(...) 
          : testFile.toString(); 
          ... 
      } 
      
    2. Используйте неродной диалог, а затем это обычный виджет, который можно проверить с помощью Qt Test.

    3. Использовать платформенные средства поиска родного диалога и взаимодействия с ним. Вам нужно будет реализовать его для каждой платформы, на которой вы собираетесь тестировать.

  2. Вы должны излучать сигнал после того, как файл был загружен. Тест может дождаться этого сигнала. Вам даже не нужно использовать явную нить для загрузки файла, идиоматический способ асинхронной загрузки файла является:

    QString filePath = ...; 
    QtConcurrent::run(ioPool, [this, filePath]{ 
        auto data = MyLoader::load(filePath); 
        emit haveFileData(data); 
    }); 
    

    Класса, где вы вызываете этот код должен иметь haveFileData сигнал, что некоторые другой код подключает и поступать по желанию. ioPool - это пул потоков, используемый для операций с привязкой к I/O, он может быть QThredPool::globalInstance(), если вы хотите, чтобы глобальный пул был пулом ввода-вывода. Пулы потоков, связанные с CPU и I/O, должны быть раздельными.

+0

Спасибо, Куба. 1. Я не знаю, что такое «тестовые крючки», но я буду искать его. 2. Это не вариант для моего проекта прямо сейчас. :/ 3. Я не совсем понял этот вариант. Я разрабатываю платформу Windows, но приложение является многоплатформенным, поэтому я не думаю, что это правильный вариант для меня. – KelvinS

+0

Re 3. Вам нужно добавить тестовые крючки, которые манипулируют диалоговым окном платформы на каждой тестируемой вами платформе. Это будет относительно легко в Windows и OS X.Это будет сложнее в Linux, где «родным» диалогом может быть диалоговое окно Qt, диалог KDE или диалог Gnome. –

+0

На самом деле, мне просто нужно это для Windows и OS X, тогда, возможно, этот вариант является возможным решением. – KelvinS