facebook/TestSlide

RecursionError when inspect.getfullargspec is mocked

Open

#160 opened on Apr 16, 2020

View on GitHub
 (0 comments) (0 reactions) (0 assignees)Python (58 forks)auto 404
bughelp wantedmock(_async)_callable

Repository metrics

Stars
 (147 stars)
PR merge metrics
 (PR metrics pending)

Description

Given:

import inspect
import subprocess
from testslide.dsl import context

class SomeClass:
  @staticmethod
  def method():
    inspect.getfullargspec(subprocess.Popen.__init__)

@context
def top(context):
  @context.example
  def repro(self):
    self.mock_callable(inspect, "getfullargspec").to_call_original()
    SomeClass.method()

When:

$ python -m testslide.cli --show-testslide-stack-trace repro.py

Then:

top
  repro: RecursionError: maximum recursion depth exceeded while calling a Python object

Failures:

  1) top: repro
    1) RecursionError: maximum recursion depth exceeded while calling a Python object
      File "testslide/runner.py", line 578, in run
        self._run_example(example)
      File "testslide/runner.py", line 562, in _run_example
        _ExampleRunner(example, self.formatter).run()
      File "testslide/__init__.py", line 441, in run
        self._sync_run_all_hooks_and_example(context_data)
      File "testslide/__init__.py", line 413, in _sync_run_all_hooks_and_example
        aggregated_exceptions.raise_correct_exception()
      File "testslide/__init__.py", line 199, in raise_correct_exception
        raise self.exceptions[0]
      File "testslide/__init__.py", line 183, in catch
        yield
      File "testslide/__init__.py", line 404, in _sync_run_all_hooks_and_example
        self._fail_if_coroutine_function(self.example.code, context_data)
      File "testslide/__init__.py", line 376, in _fail_if_coroutine_function
        return func(*args, **kwargs)
      File "repro.py", line 15, in repro
        SomeClass.method()
      File "repro.py", line 8, in method
        inspect.getfullargspec(subprocess.Popen.__init__)
      File "testslide/lib.py", line 131, in with_sig_check
        _validate_function_signature(callable_template, args, kwargs)
      File "testslide/lib.py", line 56, in _validate_function_signature
        argspec = inspect.getfullargspec(callable_template)
      File "testslide/lib.py", line 131, in with_sig_check
        _validate_function_signature(callable_template, args, kwargs)
      File "testslide/lib.py", line 56, in _validate_function_signature
        argspec = inspect.getfullargspec(callable_template)
      (last 2 lines repeat a lot)
      File "testslide/lib.py", line 125, in with_sig_check
        signature.bind(*args, **kwargs)
      File "/home/fornellas/.pyenv/versions/3.8.0/lib/python3.8/inspect.py", line 3025, in bind
        return self._bind(args, kwargs)
      File "/home/fornellas/.pyenv/versions/3.8.0/lib/python3.8/inspect.py", line 2892, in _bind
        arguments = OrderedDict()

Finished 1 example(s) in 0.8s: .
  Failed:  1

TestSlide uses inspect.getfullargspec internally, and somehow, the mock is interfering with it.

Contributor guide