Mocking in Python

Kai Riedmiller

The Problem

module.submodule

def factory_dt_ws( self, [...]) -> None:
    if self.widget_layer_select.prediction.value is None:
        log(
            "Please run a boundary prediction first!",
            thread="Segmentation",
            level="WARNING",
        )
        return
    ps_image = PlantSegImage.from_napari_layer(
        self.widget_layer_select.prediction.value
    )

    return schedule_task(
        dt_watershed_task,
        task_kwargs={
            "image": ps_image,
            [...]
        }
    )

Start Mocking

module.submodule

def factory_dt_ws( self, [...]) -> None:
    if self.widget_layer_select.prediction.value is None:
        log(
            "Please run a boundary prediction first!",
            thread="Segmentation",
            level="WARNING",
        )
        return
    ps_image = PlantSegImage.from_napari_layer(
        self.widget_layer_select.prediction.value
    )

    return schedule_task(
        dt_watershed_task,
        task_kwargs={
            "image": ps_image,
            [...]
        }
    )
def test_function(segmentation_tab, mocker):
  mocked_log = mocker.patch(
      target=
  "module.submodule.log",
  )

Start Mocking

module.submodule

def factory_dt_ws( self, [...]) -> None:
    if self.widget_layer_select.prediction.value is None:
        log(
            "Please run a boundary prediction first!",
            thread="Segmentation",
            level="WARNING",
        )
        return
    ps_image = PlantSegImage.from_napari_layer(
        self.widget_layer_select.prediction.value
    )

    return schedule_task(
        dt_watershed_task,
        task_kwargs={
            "image": ps_image,
            [...]
        }
    )
def test_function(segmentation_tab, mocker):
  mocked_log = mocker.patch(
      target=
  "module.submodule.log",
  )

  mocked_log.assert_called_with(
      "Please load an input image first!",
      thread="Segmentation",
      level="WARNING",
  )

Start Mocking

mock.assert_called()
mock.assert_called_once()
mock.assert_called_with()
mock.assert_not_called()
def test_function(segmentation_tab, mocker):
  mocked_log = mocker.patch(
      target=
  "module.submodule.log",
  )

  mocked_log.assert_called_with(
      "Please load an input image first!",
      thread="Segmentation",
      level="WARNING",
  )

Mock objects!

Mock existing objects:

def test_toggle_visibility_1(segmentation_tab, mocker):
    mocked_switch = mocker.patch.object(segmentation_tab, "toggle")

toggle is a function of segmentation_tab

Mock all the things!

mocks = mocker.patch.multiple(
    "plantseg.proofreading",
    update=mocker.DEFAULT,
    get_layer=mocker.DEFAULT,
)

mocks["update"].assert_not_called()

Mock all the things!

mocks = mocker.patch.multiple(
    "plantseg.proofreading",
    update=mocker.DEFAULT,
    get_layer=SOMETHING,
)

mocks["update"].assert_not_called()

Mock all the things! ..even nested

mock = mocker.patch(
    "plantseg.widgets"
)
mock.segmentation.show.assert_called_once()

Need a dummy?

mocker.sentinel

  • Can used as arbitrary argument
  • If asked for an attribute, it creates it
    mocker.sentinel.something does not throw an error
  • Check correct call signature of mocks with assert_called_with(mocker.sentinel)