|
11 | 11 | from rest_framework_json_api.serializers import (
|
12 | 12 | DateField,
|
13 | 13 | ModelSerializer,
|
14 |
| - ResourceIdentifierObjectSerializer |
| 14 | + ResourceIdentifierObjectSerializer, |
| 15 | + empty, |
15 | 16 | )
|
16 | 17 | from rest_framework_json_api.utils import format_resource_type
|
17 | 18 |
|
@@ -209,29 +210,33 @@ def test_polymorphic_model_serializer_passes_instance_to_child(self):
|
209 | 210 | Ensure that `PolymorphicModelSerializer` is passing the instance to the
|
210 | 211 | child serializer when initializing them
|
211 | 212 | """
|
212 |
| - # Arrange |
213 |
| - self.serializer_instance = None |
| 213 | + # Initialize a serializer that would partially update a model instance |
| 214 | + initial_data = {"artist": "Mark Bishop", "type": "artProjects"} |
| 215 | + parent_serializer = ProjectSerializer( |
| 216 | + instance=self.project, data=initial_data, partial=True |
| 217 | + ) |
214 | 218 |
|
215 |
| - def save(serializer_self): |
| 219 | + # Override `__init__` with our own method |
| 220 | + def init_with_asserts(child_self, instance=None, data=empty, **kwargs): |
216 | 221 | """
|
217 |
| - Override `ArtProjectSerializer.save` to get the instance serializer, |
218 |
| - which is later used assertion |
| 222 | + Override `ArtProjectSerializer.__init__` with the same signature that |
| 223 | + `BaseSerializer.__init__` has to assert that it receives the parameters |
| 224 | + that `BaseSerializer` expects |
219 | 225 | """
|
220 |
| - self.serializer_instance = serializer_self.instance |
221 |
| - return super(ArtProjectSerializer, serializer_self).save() |
| 226 | + assert instance == self.project |
| 227 | + assert data == initial_data |
| 228 | + assert kwargs.get("partial", False) == parent_serializer.partial |
| 229 | + assert kwargs.get("context", {}) == parent_serializer.context |
| 230 | + |
| 231 | + return super(ArtProjectSerializer, child_self).__init__( |
| 232 | + instance, data, **kwargs |
| 233 | + ) |
222 | 234 |
|
223 |
| - # Override `save` with our own method |
224 |
| - ArtProjectSerializer.save = save |
| 235 | + ArtProjectSerializer.__init__ = init_with_asserts |
225 | 236 |
|
226 |
| - # Initialize a serializer that would partially update a model instance |
227 |
| - data = {"artist": "Mark Bishop", "type": "artProjects"} |
228 |
| - serializer = ProjectSerializer( |
229 |
| - instance=self.project, data=data, partial=True |
230 |
| - ) |
231 |
| - serializer.is_valid(raise_exception=True) |
| 237 | + parent_serializer.is_valid(raise_exception=True) |
232 | 238 |
|
233 |
| - # Act |
234 |
| - serializer.save() |
| 239 | + # Run save to force `ProjectSerializer` to init `ArtProjectSerializer` |
| 240 | + parent_serializer.save() |
235 | 241 |
|
236 |
| - # Assert |
237 |
| - assert self.serializer_instance is not None |
| 242 | + # Asserts in the overridden `__init__` method declared above |
0 commit comments