Bird
Raised Fist0
PyTesttesting~20 mins

monkeypatch fixture in PyTest - Practice Problems & Coding Challenges

Choose your learning style10 modes available
Challenge - 5 Problems
🎖️
Monkeypatch Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
❓ Predict Output
intermediate
2:00remaining
Output of monkeypatching a function
What is the output of the following pytest test when using the monkeypatch fixture?
PyTest
def get_data():
    return "original"

def test_monkeypatch(monkeypatch):
    def fake_get_data():
        return "patched"
    monkeypatch.setattr(__name__, "get_data", fake_get_data)
    result = get_data()
    print(result)
Aoriginal
BNone
Cpatched
DRaises AttributeError
Attempts:
2 left
💡 Hint
Think about what monkeypatch.setattr does to the function get_data in the current module.
❓ assertion
intermediate
2:00remaining
Correct assertion after monkeypatching an environment variable
Which assertion correctly verifies that the environment variable 'API_KEY' is patched to '12345' using monkeypatch?
PyTest
import os

def test_env(monkeypatch):
    monkeypatch.setenv('API_KEY', '12345')
    # Which assertion below is correct?
Aassert os.environ.get('API_KEY') is None
Bassert os.environ['API_KEY'] == '12345'
Cassert monkeypatch.getenv('API_KEY') == '12345'
Dassert os.getenv('API_KEY') == 12345
Attempts:
2 left
💡 Hint
Remember environment variables are strings and monkeypatch.setenv changes os.environ.
🔧 Debug
advanced
2:00remaining
Why does monkeypatch fail to patch a method?
Given the code below, why does monkeypatch.setattr fail to patch the method 'fetch' of class DataFetcher?
PyTest
class DataFetcher:
    def fetch(self):
        return "real data"

def test_fetch(monkeypatch):
    def fake_fetch(self):
        return "fake data"
    monkeypatch.setattr(DataFetcher, 'fetch', fake_fetch)
    fetcher = DataFetcher()
    result = fetcher.fetch()
    assert result == "fake data"
AThe test will pass; monkeypatch correctly patches the method
Bmonkeypatch.setattr cannot patch class methods
CThe fake_fetch method is missing the self parameter
DThe fake_fetch method is not bound to the instance, causing a TypeError
Attempts:
2 left
💡 Hint
Check the method signature and how monkeypatch works on class methods.
🧠 Conceptual
advanced
2:00remaining
Scope of monkeypatch fixture in pytest
Which statement best describes the scope of changes made by the monkeypatch fixture in a pytest test?
AChanges made by monkeypatch affect only the imported modules, not local functions
BChanges made by monkeypatch persist across all tests in the module
CChanges made by monkeypatch require manual cleanup to revert
DChanges made by monkeypatch are reverted after the test function finishes
Attempts:
2 left
💡 Hint
Think about test isolation and cleanup in pytest.
❓ framework
expert
3:00remaining
Using monkeypatch to mock a network call in pytest
You want to test a function that calls requests.get to fetch data from the internet. Which monkeypatch usage correctly mocks requests.get to return a response with status_code 200 and text 'mocked data'?
PyTest
import requests

def fetch_url(url):
    response = requests.get(url)
    return response.text

def test_fetch_url(monkeypatch):
    # Which option correctly mocks requests.get?
A
def fake_get(url):
    class Response:
        status_code = 200
        text = 'mocked data'
    return Response()
monkeypatch.setattr(requests, 'get', fake_get)
Bmonkeypatch.setattr(requests.get, 'return_value', {'status_code': 200, 'text': 'mocked data'})
Cmonkeypatch.setattr('requests.get', lambda url: {'status_code': 200, 'text': 'mocked data'})
D
def fake_get():
    return {'status_code': 200, 'text': 'mocked data'}
monkeypatch.setattr(requests, 'get', fake_get)
Attempts:
2 left
💡 Hint
requests.get returns a Response object, not a dictionary.

Practice

(1/5)
1. What is the primary purpose of the monkeypatch fixture in pytest?
easy
A. To temporarily replace parts of the code during tests
B. To permanently change the source code
C. To speed up the pytest installation
D. To generate test reports automatically

Solution

  1. Step 1: Understand monkeypatch usage

    The monkeypatch fixture is used to temporarily replace or modify parts of the code during test execution.
  2. Step 2: Differentiate temporary vs permanent changes

    It does not permanently change source code but only affects the test runtime environment.
  3. Final Answer:

    To temporarily replace parts of the code during tests -> Option A
  4. Quick Check:

    Temporary code replacement = B [OK]
Hint: Remember monkeypatch changes code only during tests [OK]
Common Mistakes:
  • Thinking monkeypatch changes code permanently
  • Confusing monkeypatch with test report tools
  • Assuming monkeypatch speeds up pytest installation
2. Which of the following is the correct way to use monkeypatch to replace a function get_data in a module my_module?
easy
A. monkeypatch.replace('my_module.get_data', lambda: 'mocked')
B. monkeypatch.setattr(my_module.get_data, lambda: 'mocked')
C. monkeypatch.setattr('my_module.get_data', lambda: 'mocked')
D. monkeypatch.patch('my_module.get_data', lambda: 'mocked')

Solution

  1. Step 1: Recall monkeypatch syntax

    The correct method to replace an attribute or function is monkeypatch.setattr(target, value) where target is a string path.
  2. Step 2: Identify correct target format

    The target must be a string like 'my_module.get_data', not the function object itself.
  3. Final Answer:

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

    Use setattr with string target = A [OK]
Hint: Use setattr with string path to replace functions [OK]
Common Mistakes:
  • Passing function object instead of string path
  • Using non-existent monkeypatch methods like replace or patch
  • Confusing monkeypatch with unittest.mock syntax
3. Given the code below, what will be the output of the test?
def get_value():
    return 10

def test_value(monkeypatch):
    monkeypatch.setattr('__main__.get_value', lambda: 5)
    assert get_value() == ?
medium
A. 10
B. 5
C. AssertionError
D. TypeError

Solution

  1. Step 1: Understand monkeypatch effect on get_value

    The monkeypatch replaces get_value in the __main__ module with a lambda returning 5.
  2. Step 2: Evaluate the assertion

    Calling get_value() now returns 5, so assert get_value() == 5 passes.
  3. Final Answer:

    5 -> Option B
  4. Quick Check:

    Patched function returns 5 = A [OK]
Hint: Patched function returns new value, not original [OK]
Common Mistakes:
  • Expecting original return value 10
  • Thinking monkeypatch causes error
  • Confusing module path for patching
4. What is wrong with this test code using monkeypatch?
def test_env(monkeypatch):
    monkeypatch.setenv('API_KEY')
    assert os.getenv('API_KEY') is None
medium
A. monkeypatch cannot patch environment variables
B. os.getenv cannot be used in tests
C. assertion should check for empty string, not None
D. setenv requires two arguments: key and value

Solution

  1. Step 1: Check monkeypatch.setenv usage

    The setenv method requires both a key and a value to set an environment variable.
  2. Step 2: Identify missing argument

    Here, only the key 'API_KEY' is given, missing the value argument.
  3. Final Answer:

    setenv requires two arguments: key and value -> Option D
  4. Quick Check:

    setenv needs key and value = C [OK]
Hint: Always provide key and value to setenv [OK]
Common Mistakes:
  • Calling setenv with only one argument
  • Assuming os.getenv is not usable in tests
  • Thinking monkeypatch can't patch env variables
5. You want to test a function that reads a config file using open. How can you use monkeypatch to avoid reading a real file and instead provide fake content?
hard
A. Use monkeypatch.setattr to replace builtins.open with a function returning a StringIO with fake data
B. Use monkeypatch.setenv to set a fake file path environment variable
C. Use monkeypatch.setitem to replace the file path in a dictionary
D. Use monkeypatch.delattr to delete the open function

Solution

  1. Step 1: Identify how to fake file reading

    Replacing open with a function returning a StringIO object simulates file reading without disk access.
  2. Step 2: Use monkeypatch.setattr on builtins.open

    Monkeypatch can replace builtins.open with a lambda or function returning StringIO containing fake content.
  3. Final Answer:

    Use monkeypatch.setattr to replace builtins.open with a function returning a StringIO with fake data -> Option A
  4. Quick Check:

    Patch open with StringIO = D [OK]
Hint: Patch builtins.open with StringIO for fake file content [OK]
Common Mistakes:
  • Trying to delete open instead of replacing it
  • Using setenv which doesn't fake file reading
  • Replacing dictionary keys instead of open function
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