Demystifying Mocking and Readonly Properties in Python Testing

Nkugwa Mark William
2 min readAug 29, 2023

--

Software testing is like ensuring that your car’s safety features work as expected. You don’t crash a real car to see if the airbags deploy, do you? Similarly, in software, we don’t always want to interact with real components when testing. That’s where “mocking” comes in — a technique that allows us to simulate the behavior of real objects in controlled environments. Let’s explore this concept through an analogy of a car repair shop.

Imagine you own a car repair shop, and you’re tasked with testing airbag deployment in cars. Here’s how it correlates with mocking:

Analogy: Testing Airbag Deployment

  1. Real Car Testing: To test airbags in real cars, you’d need to crash them, which is dangerous and wasteful. It’s like using real components in software testing, risking data loss or unforeseen issues.
  2. Mocked Airbag Test: Instead of crashing cars, you use “mocked cars” with simulated airbag deployments. These mock cars mimic real cars without the actual danger. Similarly, in software, we use “mock objects” that imitate real components for testing purposes.

Example 1: Mocking Methods

In Python, we have the unittest.mock library, commonly known as mock. Let's look at a scenario where you're testing a car diagnostics system that calls a method to check the engine's health.

from unittest.mock import Mock

class CarDiagnostics:
def check_engine_health(self):
# Simulate checking the engine health
return "Healthy"

def test_car_diagnostics():
mock_car = Mock(spec=CarDiagnostics)
mock_car.check_engine_health.return_value = "Faulty"

result = mock_car.check_engine_health()
print("Engine health:", result) # Output: Engine health: Faulty

In this example, the Mock class creates a mock object that simulates the CarDiagnostics class. The mock's check_engine_health method is set to return "Faulty", allowing you to test how your code responds to a faulty engine.

Example 2: Readonly Properties

Now let’s consider the scenario of testing a readonly property. Think of this as an odometer in a car — it’s read-only because you can’t change it manually.

from unittest.mock import Mock

class Car:
@property
def odometer(self):
# Simulate reading the odometer
return 50000

def test_car_odometer():
mock_car = Mock(spec=Car)
mock_car.odometer = 60000 # Overriding the mock's behavior

result = mock_car.odometer
print("Odometer reading:", result) # Output: Odometer reading: 60000

In this example, the Mock object simulates the Car class, particularly the odometer property. By setting the mock's odometer value to 60000, you simulate reading an updated odometer value.

Why Readonly Properties Matter

Readonly properties are essential in software testing for simulating real-world scenarios without altering actual data. Just as crashing real cars is dangerous, altering real data in testing could lead to unintended consequences. Readonly properties, when mocked, allow you to test different conditions without modifying real data.

Conclusion

Mocking and readonly properties are powerful tools in software testing, akin to simulating airbag deployments without crashing cars. By using the mock library, you can create mock objects that mimic real components, facilitating controlled testing environments. Readonly properties, when mocked, enable testing without altering real data, ensuring that testing remains safe and predictable. Much like a car repair shop ensures airbag functionality without actual crashes, mocking and readonly properties ensure software quality without unintended consequences.

--

--

Nkugwa Mark William
Nkugwa Mark William

Written by Nkugwa Mark William

Nkugwa Mark William is a Chemical and Process engineer , entrepreneur, software engineer and a technologists with Apps on google play store and e commerce sites

No responses yet