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.