python type_error ai_generated true

TypeError: 'int' object is not callable when using mock.side_effect with an iterable

ID: python/unittest-mock-side-effect-type-error

Also available as: JSON · Markdown · 中文
80%Fix Rate
87%Confidence
0Evidence
2024-10-05First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
3.8 active
3.9 active

Root Cause

The side_effect attribute of a mock is set to an iterable (e.g., a list) that contains non-callable elements, but the mock is called as a function, causing a TypeError when trying to call the element.

generic

中文

mock的side_effect属性被设置为包含不可调用元素的可迭代对象(如列表),但mock作为函数被调用,导致尝试调用元素时出现TypeError。

Workarounds

  1. 90% success Ensure all elements in the side_effect iterable are callable (e.g., functions or exceptions)
    mock.side_effect = [lambda: 1, lambda: 2, ValueError('error')]
    Now each call to mock() will call the respective lambda or raise the exception.
  2. 85% success Use side_effect with a function that generates values dynamically
    def side_effect_func():
        return 42
    mock.side_effect = side_effect_func
    This ensures the mock is callable.

Dead Ends

Common approaches that don't work:

  1. Setting side_effect to a single value instead of an iterable 60% fail

    This changes the behavior; the mock will return that value for every call, which may not match the expected test scenario.

  2. Using return_value instead of side_effect 50% fail

    This only sets a single return value for all calls, not allowing different responses per call.