Bird
Raised Fist0
PyTesttesting~5 mins

monkeypatch.setattr in PyTest - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is monkeypatch.setattr used for in pytest?
<p><code>monkeypatch.setattr</code> temporarily replaces an attribute or method in a module or class during a test. It helps simulate different behaviors without changing the real code.</p>
Click to reveal answer
beginner
How does monkeypatch.setattr help in testing functions that depend on external resources?

It allows you to replace calls to external resources (like APIs or databases) with fake functions or values. This makes tests faster and more reliable by avoiding real external calls.

Click to reveal answer
beginner
Example: What does this code do?
monkeypatch.setattr('os.path.exists', lambda path: True)

This replaces the os.path.exists function with a fake one that always returns True. So, any code checking if a file exists will think it does.

Click to reveal answer
intermediate
What happens to the original attribute after the test using monkeypatch.setattr finishes?

The original attribute is restored automatically after the test ends. This keeps tests isolated and prevents side effects on other tests.

Click to reveal answer
intermediate
Can monkeypatch.setattr be used to patch instance attributes as well as module-level functions?

Yes, it can patch both instance attributes and module-level functions or variables by specifying the target correctly.

Click to reveal answer
What does monkeypatch.setattr do in pytest?
ARuns tests in parallel
BPermanently changes the source code
CTemporarily replaces an attribute or method during a test
DGenerates test reports
After using monkeypatch.setattr, what happens to the original attribute after the test ends?
AIt is restored automatically
BIt is deleted
CIt causes an error
DIt stays replaced
Which of these is a good use case for monkeypatch.setattr?
AReplacing a function that calls an external API with a fake one
BChanging the Python interpreter version
CModifying test runner settings
DWriting new test cases
How do you specify the target to patch with monkeypatch.setattr?
ABy creating a new test file
BBy editing the source code file
CBy running a shell command
DBy giving the full import path as a string or the object and attribute name
Can monkeypatch.setattr patch instance attributes?
ANo, only module-level functions
BYes, if the target is specified correctly
COnly for classes, not instances
DOnly for built-in types
Explain how monkeypatch.setattr helps in writing tests that avoid calling real external services.
Think about how you can fake parts of your code during tests.
You got /4 concepts.
    Describe the steps to use monkeypatch.setattr to replace a method in a module for a test.
    Focus on how you specify what to patch and what to replace it with.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main purpose of monkeypatch.setattr in pytest?
      easy
      A. To temporarily replace an attribute or function during a test
      B. To permanently change code in the source files
      C. To skip a test function
      D. To run tests in parallel

      Solution

      1. Step 1: Understand monkeypatch.setattr usage

        It is used to temporarily replace or modify attributes or functions during a test to isolate behavior.
      2. Step 2: Differentiate from other pytest features

        It does not permanently change code or skip tests; it only affects the test scope temporarily.
      3. Final Answer:

        To temporarily replace an attribute or function during a test -> Option A
      4. Quick Check:

        Temporary replacement = A [OK]
      Hint: Think 'temporary change' during test only [OK]
      Common Mistakes:
      • Confusing temporary patching with permanent code changes
      • Thinking it skips tests
      • Assuming it runs tests in parallel
      2. Which of the following is the correct syntax to patch the function get_data in module my_module using monkeypatch in pytest?
      easy
      A. monkeypatch.setattr('get_data', my_module, lambda: 42)
      B. monkeypatch.setattr('my_module.get_data', lambda: 42)
      C. monkeypatch.setattr(my_module, 'get_data', lambda: 42)
      D. monkeypatch.setattr('my_module', 'get_data', 42)

      Solution

      1. Step 1: Identify correct monkeypatch.setattr signature

        The correct usage is monkeypatch.setattr(target_object, attribute_name, new_value).
      2. Step 2: Match parameters to patch get_data function

        We pass the module object my_module, the attribute name 'get_data', and the replacement function lambda: 42.
      3. Final Answer:

        monkeypatch.setattr(my_module, 'get_data', lambda: 42) -> Option C
      4. Quick Check:

        Object, attribute, new value = A [OK]
      Hint: Pass object, attribute name, then new value [OK]
      Common Mistakes:
      • Passing attribute as a string path instead of object and attribute
      • Swapping parameters order
      • Passing value instead of function for patching
      3. Given the code below, what will be the output of the test?
      import my_module
      
      def test_func(monkeypatch):
          def fake_func():
              return 10
          monkeypatch.setattr(my_module, 'get_value', fake_func)
          result = my_module.get_value()
          print(result)
      medium
      A. None
      B. Original value from my_module.get_value()
      C. AttributeError
      D. 10

      Solution

      1. Step 1: Understand monkeypatch effect on get_value

        The original my_module.get_value is replaced temporarily by fake_func which returns 10.
      2. Step 2: Evaluate the call and print output

        Calling my_module.get_value() inside the test calls fake_func(), so it prints 10.
      3. Final Answer:

        10 -> Option D
      4. Quick Check:

        Patched function returns 10 [OK]
      Hint: Patched function output replaces original during test [OK]
      Common Mistakes:
      • Expecting original function output instead of patched
      • Thinking patch is permanent outside test
      • Assuming print outputs None
      4. What is wrong with the following pytest test using monkeypatch?
      def test_example(monkeypatch):
          monkeypatch.setattr('os.path.exists', lambda x: True)
          assert os.path.exists('anyfile.txt') == True
      medium
      A. The lambda function should accept no arguments
      B. The first argument to setattr should be the module object, not a string
      C. os.path.exists cannot be patched
      D. The assert statement is incorrect

      Solution

      1. Step 1: Check monkeypatch.setattr usage

        The first argument must be the module or object, not a string path.
      2. Step 2: Identify correct usage

        It should be monkeypatch.setattr(os.path, 'exists', lambda x: True) to patch the function properly.
      3. Final Answer:

        The first argument to setattr should be the module object, not a string -> Option B
      4. Quick Check:

        Object, not string path = B [OK]
      Hint: Pass object, not string path, as first argument [OK]
      Common Mistakes:
      • Passing string path instead of module object
      • Incorrect lambda parameters
      • Assuming some functions cannot be patched
      5. You want to test a function fetch_data() that calls requests.get. How can you use monkeypatch.setattr to replace requests.get with a fake function that returns a mock response with status_code=200 and text='OK'?
      hard
      A. Define a fake function returning a mock object, then patch with monkeypatch.setattr(requests, 'get', fake_func)
      B. Patch requests.get with a string 'mock' using monkeypatch.setattr
      C. Use monkeypatch.setattr('requests.get', fake_func) with a lambda returning 200
      D. Replace fetch_data with a fake function instead of patching requests.get

      Solution

      1. Step 1: Create a fake function returning a mock response

        Define a function that returns an object with status_code=200 and text='OK'.
      2. Step 2: Patch requests.get with monkeypatch.setattr

        Use monkeypatch.setattr(requests, 'get', fake_func) to replace the real HTTP call during the test.
      3. Final Answer:

        Define a fake function returning a mock object, then patch with monkeypatch.setattr(requests, 'get', fake_func) -> Option A
      4. Quick Check:

        Patch requests.get with fake function = D [OK]
      Hint: Patch requests.get with a fake function returning mock response [OK]
      Common Mistakes:
      • Passing string path instead of module object
      • Patching with wrong types like strings
      • Replacing the wrong function instead of requests.get
      Recommended

      Ready to prove it?

      Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

      10 questions~5 mineasy hard