DUnit GUI-тест закрытия модального окна зависает при запуске в TeamCity

Я пытался выполнить тест графического интерфейса с DUnit, который включает взаимодействие с модальными окнами через систему таймера цикла сообщений от @tomazy (см. мой предыдущий вопрос для получения более подробной информации: (Как) я могу использовать FutureWindows со стандартными диалогами открытия файлов? ).

Мое решение в другом вопросе отлично работает, когда я запускаю тесты вручную, но когда я запускаю это в системе непрерывной сборки в TeamCity, оно зависает, когда нужно обработать сообщение OK в диалоговом окне. У службы, которая запускает тесты, установлено разрешение «взаимодействовать с рабочим столом», и я убедился, что зависание происходит ТОЛЬКО при нажатии кнопки «ОК» (т. е. происходит уведомление CDN_FILEOK). Я могу закрыть диалоговое окно с помощью WM_CLOSE, но это, естественно, не приводит к тому, что диалоговое окно возвращает модальный результат OK, и поэтому его нельзя использовать.

Если я не смогу заставить это работать, мне, вероятно, придется изменить производственный код (цель теста), чтобы опубликовать событие, чтобы дать имя файла и иметь в нем тестовый хук и дать его без диалога, но я хотелось бы знать, что вызывает эту проблему, и желательно, конечно, решить ее, не изменяя производственный код.


person DelphiUser    schedule 01.03.2012    source источник
comment
Вы используете это в Vista и выше? Если это так, вполне возможно, что вы столкнулись с проблемой изоляции сеанса 0.   -  person David Heffernan    schedule 01.03.2012
comment
Да, это Windows 7. Меня озадачивает, что некоторые (большинство) сообщений вроде работают без проблем, но виснет только ключевое (ОК). Я проверил это, пытаясь закрыть диалог с отправкой ключа возврата и отправкой (и публикацией, протестированной с обоими) сообщениями кнопки мыши вниз + вверх на кнопку открытия и просто отправкой WM_CLOSE, и он зависает в случае ОК, т.е. с клавиша возврата или мышь вверх по паре вверх-вниз (щелчок).   -  person DelphiUser    schedule 01.03.2012
comment
Это специальный стандартный диалог для Windows (уведомление CDN_FILEOK для меня новое)? Или вы можете воспроизвести проблему и с самодельным диалогом?   -  person mjn    schedule 01.03.2012
comment
Это стандартный диалог открытия файла. Информация об уведомлении, которую я взял отсюда: msdn.microsoft.com/en-us/library/windows/desktop/, а также в методе Vcl.Dialogs.TOpenDialog.WndProc, где у него есть кейс для WM_NOTIFY и под ним кейс для CDN_FILEOK (в LOFNotify.hdr.code, созданный из LParam). С самодельным диалогом не пробовал, можно попробовать...   -  person DelphiUser    schedule 01.03.2012
comment
Использование фиктивной формы, созданной самостоятельно, как показано ниже, сработало. Эта форма, конечно, не имеет собственного WndProc. 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.2012
comment
Хм, похоже, в комментарии не очень хорошо получается многострочный код :(   -  person DelphiUser    schedule 01.03.2012
comment
Эта форма, конечно, не имеет собственного WndProc. Конечно, это так. Все окна имеют WndProc. В данном случае это реализуется инфраструктурой обмена сообщениями VCL.   -  person David Heffernan    schedule 01.03.2012
comment
Ну, я имел в виду отсутствие переопределенной специальной реализации WndProc.   -  person DelphiUser    schedule 01.03.2012