Я пытался выполнить тест графического интерфейса с DUnit, который включает взаимодействие с модальными окнами через систему таймера цикла сообщений от @tomazy (см. мой предыдущий вопрос для получения более подробной информации: (Как) я могу использовать FutureWindows со стандартными диалогами открытия файлов? ).
Мое решение в другом вопросе отлично работает, когда я запускаю тесты вручную, но когда я запускаю это в системе непрерывной сборки в TeamCity, оно зависает, когда нужно обработать сообщение OK в диалоговом окне. У службы, которая запускает тесты, установлено разрешение «взаимодействовать с рабочим столом», и я убедился, что зависание происходит ТОЛЬКО при нажатии кнопки «ОК» (т. е. происходит уведомление CDN_FILEOK). Я могу закрыть диалоговое окно с помощью WM_CLOSE, но это, естественно, не приводит к тому, что диалоговое окно возвращает модальный результат OK, и поэтому его нельзя использовать.
Если я не смогу заставить это работать, мне, вероятно, придется изменить производственный код (цель теста), чтобы опубликовать событие, чтобы дать имя файла и иметь в нем тестовый хук и дать его без диалога, но я хотелось бы знать, что вызывает эту проблему, и желательно, конечно, решить ее, не изменяя производственный код.
MyForm := TForm.Create(nil); MyBtn := TButton.Create(MyForm); MyBtn.ModalResult := mrOk; MyBtn.Parent := MyForm; TFutureWindows.Expect(TForm.ClassName) .ExecProc( procedure (const AWindow: IWindow) var TheForm: TForm; begin TheForm := AWindow.AsControl as TForm; (TheForm.Controls[0] as TButton).Click; end ); Result := MyForm.ShowModal = mrOk; MyForm.Free;
- person DelphiUser   schedule 01.03.2012WndProc
. В данном случае это реализуется инфраструктурой обмена сообщениями VCL. - person David Heffernan   schedule 01.03.2012