Skip to content

poor exception handling of monkeypatch.setattr on property-decorated attributes #1270

Closed

Description

@Dowwie

Occasionally, I make the mistake of monkeypatch.setattr the name of a property-decorated attribute rather than the underlying attribute that is referenced by the property. In this situation, pytest fails to monkeypatch-set an attribute that doesn't exist -- makes sense. What doesn't make sense is the exception that is raised.

take, for instance, this basic test module:

import pytest

class MockClass:

    def __init__(self):
        self._name = 'mockymocky'

    @property
    def name(self):
        return self._name

def test_anything(monkeypatch):
    mc = MockClass()
    monkeypatch.setattr(mc, 'name', 'anything')
    assert mc.name == 'anything'

monkeypatch.setattr(mc, 'name', 'anything') raises "INTERNALERROR> IndexError: list index out of range" exception when running a pytest.

Would you please consider creating a more descriptive exception that describes this kind of problem?

Activity

  1. added
    type: bugproblem that needs to be addressed
    topic: reportingrelated to terminal output and user-facing messages and errors
    on Dec 18, 2015
  2. The-Compiler commented on Dec 18, 2015

    @The-Compiler
    Member

    Full traceback:

    Traceback (most recent call last):
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/main.py", line 90, in wrap_session
        session.exitstatus = doit(config, session) or 0
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/main.py", line 121, in _main
        config.hook.pytest_runtestloop(session=session)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 724, in __call__
        return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 338, in _hookexec
        return self._inner_hookexec(hook, methods, kwargs)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 333, in <lambda>
        _MultiCall(methods, kwargs, hook.spec_opts).execute()
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 596, in execute
        res = hook_impl.function(*args)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/main.py", line 146, in pytest_runtestloop
        item.config.hook.pytest_runtest_protocol(item=item, nextitem=nextitem)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 724, in __call__
        return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 338, in _hookexec
        return self._inner_hookexec(hook, methods, kwargs)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 333, in <lambda>
        _MultiCall(methods, kwargs, hook.spec_opts).execute()
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 595, in execute
        return _wrapped_call(hook_impl.function(*args), self.execute)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 253, in _wrapped_call
        return call_outcome.get_result()
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 278, in get_result
        raise ex[1].with_traceback(ex[2])
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 264, in __init__
        self.result = func()
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 596, in execute
        res = hook_impl.function(*args)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/runner.py", line 65, in pytest_runtest_protocol
        runtestprotocol(item, nextitem=nextitem)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/runner.py", line 77, in runtestprotocol
        nextitem=nextitem))
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/runner.py", line 121, in call_and_report
        report = hook.pytest_runtest_makereport(item=item, call=call)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 724, in __call__
        return self._hookexec(self, self._nonwrappers + self._wrappers, kwargs)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 338, in _hookexec
        return self._inner_hookexec(hook, methods, kwargs)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 333, in <lambda>
        _MultiCall(methods, kwargs, hook.spec_opts).execute()
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 595, in execute
        return _wrapped_call(hook_impl.function(*args), self.execute)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 249, in _wrapped_call
        wrap_controller.send(call_outcome)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/skipping.py", line 170, in pytest_runtest_makereport
        rep = outcome.get_result()
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 278, in get_result
        raise ex[1].with_traceback(ex[2])
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 264, in __init__
        self.result = func()
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/vendored_packages/pluggy.py", line 596, in execute
        res = hook_impl.function(*args)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/runner.py", line 227, in pytest_runtest_makereport
        style=item.config.option.tbstyle)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/python.py", line 715, in _repr_failure_py
        style=style)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/_pytest/main.py", line 410, in _repr_failure_py
        style=style, tbfilter=tbfilter)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/py/_code/code.py", line 412, in getrepr
        return fmt.repr_excinfo(self)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/py/_code/code.py", line 590, in repr_excinfo
        reprtraceback = self.repr_traceback(excinfo)
      File "/home/florian/.venv/local/lib/python3.4/site-packages/py/_code/code.py", line 577, in repr_traceback
        last = traceback[-1]
      File "/home/florian/.venv/local/lib/python3.4/site-packages/py/_code/code.py", line 284, in __getitem__
        val = super(Traceback, self).__getitem__(key)
    IndexError: list index out of range
    
  3. RonnyPfannschmidt commented on Jan 19, 2016

    @RonnyPfannschmidt
    Member

    @Dowwie why close this one

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    topic: reportingrelated to terminal output and user-facing messages and errorstype: bugproblem that needs to be addressed

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions