Compatibility with Pyface test utilities¶
UITester
is intended to be compatible with Pyface’s ModalDialogTester
,
(for testing with modal dialogs) and GuiTestAssistant
(for general
GUI event loop handling in tests).
Testing with modal dialogs¶
When a test involves a modal dialog, ModalDialogTester
will be needed.
UITester
can be used together, for example, to launch the modal dialog
which then gets closed by ModalDialogTester
:
from pyface.constant import OK
from pyface.toolkit import toolkit_object
from traitsui.testing.api import MouseClick, UITester
ModalDialogTester = toolkit_object(
"util.modal_dialog_tester:ModalDialogTester"
)
tester = UITester()
with tester.create_ui(demo) as ui:
simple_button = tester.find_by_id(ui, "simple")
def click_simple_button():
simple_button.perform(MouseClick())
modal_tester = ModalDialogTester(click_simple_button)
modal_tester.open_and_run(lambda x: x.click_button(OK))
assert modal_tester.dialog_was_opened
But if you try to modify or inspect GUI states using UITester
while the
dialog is opened, you should set the auto_process_events
attribute to false for those operations. Otherwise the ModalDialogTester and
UITester will enter a deadlock that blocks forever.
Example:
def when_opened(modal_dialog_tester):
ui_tester = UITester(auto_process_events=False)
ui_tester.find_by_id(ui, "button").perform(MouseClick())
modal_dialog_tester = ModalDialogTester(callable_to_open_dialog)
modal_dialog_tester.open_and_run(when_opened)
In the above example, ui
is an instance of UI
that has been obtained
elsewhere in the test. Note that you can instantiate as many UITester
objects
as you need.
Using UITester and GuiTestAssistant¶
GuiTestAssistant
is a more general tool dealing with GUI processing in tests.
UITester
, on the other hand, is a more specific tool for testing GUI
components managed by TraitsUI. The two can be used together in tests.
GuiTestAssistant
has been around before UITester
is introduced.
Since various methods on UIWrapper
(such as perform()
and
inspect()
) automatically request GUI events to be processed, where
they are used entirely for modifying and inspecting GUI states, some previous
usage of GuiTestAssistant
features may no longer be necessary.