Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Testing models in Django
📖 Scenario: You are building a simple Django app to manage books in a library. You want to make sure your Book model works correctly by writing tests.
🎯 Goal: Write tests for the Book model to check that it saves and retrieves data correctly.
📋 What You'll Learn
Create a Book model with fields title and author
Add a test case class for the Book model
Write a test method to create and save a Book instance
Write a test method to retrieve the saved Book and check its fields
💡 Why This Matters
🌍 Real World
Testing models ensures your data structure works correctly before your app runs in production. It helps catch bugs early.
💼 Career
Writing model tests is a key skill for Django developers to maintain reliable and maintainable codebases.
Progress0 / 4 steps
1
Create the Book model
Create a Django model called Book with two fields: title as a CharField with max length 100, and author as a CharField with max length 50.
Django
Hint
Use models.CharField for text fields and set max_length as instructed.
2
Set up the test case class
Create a test case class called BookModelTest that inherits from django.test.TestCase.
Django
Hint
Import TestCase from django.test and create an empty test class.
3
Write a test to create and save a Book
Inside the BookModelTest class, write a test method called test_create_book that creates a Book instance with title set to 'Django for Beginners' and author set to 'William S. Vincent', then saves it.
Django
Hint
Define a method starting with test_ inside the test class. Create and save the Book instance inside it.
4
Write a test to retrieve and check the Book
Add a test method called test_retrieve_book inside BookModelTest that retrieves the saved Book by filtering title='Django for Beginners' and asserts that the author is 'William S. Vincent' using self.assertEqual.
Django
Hint
Use Book.objects.get() to find the book and self.assertEqual() to check the author.
Practice
(1/5)
1. What is the main purpose of testing Django models?
easy
A. To ensure the data logic and model methods work correctly
B. To improve the website's visual design
C. To speed up the server response time
D. To create user interface components
Solution
Step 1: Understand the role of models in Django
Models define data structure and logic in Django applications.
Step 2: Identify the goal of testing models
Testing models ensures that data saving, retrieval, and custom methods behave as expected.
Final Answer:
To ensure the data logic and model methods work correctly -> Option A
Quick Check:
Testing models = data logic correctness [OK]
Hint: Models hold data logic; tests check if it works right [OK]
Common Mistakes:
Confusing model testing with UI testing
Thinking model tests improve site speed
Assuming model tests create frontend components
2. Which of the following is the correct way to start a test method in a Django TestCase class?
easy
A. def check_model(self):
B. def test_model(self):
C. def model_test(self):
D. def testing_model(self):
Solution
Step 1: Recall Django test method naming conventions
Django runs test methods only if their names start with test_.
Step 2: Match the method name to the convention
Only def test_model(self): starts with test_, so it will be executed as a test.
Final Answer:
def test_model(self): -> Option B
Quick Check:
Test methods start with 'test_' [OK]
Hint: Test methods must start with 'test_' to run [OK]
Common Mistakes:
Using method names without 'test_' prefix
Assuming any method in TestCase runs as test
Confusing test method naming with variable names
3. Given this Django model and test code, what will be the output of the test?
class Product(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class ProductTest(TestCase):
def test_str_method(self):
p = Product(name='Book')
self.assertEqual(str(p), 'Book')
medium
A. Test passes successfully
B. Test fails with AssertionError
C. Test raises a TypeError
D. Test raises a ValueError
Solution
Step 1: Understand the __str__ method in Product model
The __str__ method returns the product's name string.
Step 2: Analyze the test code behavior
The test creates a Product instance with name 'Book' and checks if str(p) equals 'Book'. Since __str__ returns name, this is true.
Final Answer:
Test passes successfully -> Option A
Quick Check:
__str__ returns name, so test passes [OK]
Hint: Check __str__ returns expected string for test pass [OK]
Common Mistakes:
Forgetting to save the model instance before testing
Assuming __str__ returns something else
Confusing test failure with error
4. Identify the error in this Django model test code:
class UserProfile(models.Model):
age = models.IntegerField()
class UserProfileTest(TestCase):
def test_age_positive(self):
profile = UserProfile(age=-5)
self.assertTrue(profile.age > 0)
medium
A. The model field type is incorrect for age
B. The test method name does not start with 'test_'
C. The test will fail because age is negative but no validation is done
D. The test should use assertFalse instead of assertTrue
Solution
Step 1: Review the test logic
The test creates a UserProfile with age -5 and asserts age > 0, which is false.
Step 2: Identify why the test fails
There is no validation preventing negative age, so the test fails as expected.
Final Answer:
The test will fail because age is negative but no validation is done -> Option C
Quick Check:
Negative age without validation causes test failure [OK]
Hint: Check test logic matches model validation to avoid failure [OK]
Common Mistakes:
Assuming test method name is wrong
Thinking IntegerField rejects negatives by default
Confusing assertTrue with assertFalse usage
5. You want to test a custom model method that returns the full name by combining first and last names. Which approach correctly tests this method?
class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
def full_name(self):
return f"{self.first_name} {self.last_name}"
# Test code?
hard
A. Use assertEqual on first_name and last_name separately
B. Only check if first_name and last_name fields exist in the model
C. Test full_name() without creating a Person instance
D. Create a Person instance, call full_name(), and assert the combined string
Solution
Step 1: Understand what the full_name method does
It returns a string combining first_name and last_name with a space.
Step 2: Determine how to test this method
Create a Person instance with known names, call full_name(), and check if the result matches the expected combined string.
Final Answer:
Create a Person instance, call full_name(), and assert the combined string -> Option D
Quick Check:
Test custom method by calling it on instance and checking output [OK]
Hint: Test custom methods by calling them on model instances [OK]
Common Mistakes:
Testing fields instead of method output
Calling method without instance
Checking fields separately instead of combined result