Skip to content

Commit 3532bbb

Browse files
committed
Assert that the init receives the expected arguments
Make the test more independent for the current DRF Serializer implementation by overriding the `__init__` and asserting that it receives the expected arguments. Also move the asserts to overridden init to avoid using extra unneeded variables
1 parent a5f956a commit 3532bbb

File tree

1 file changed

+25
-20
lines changed

1 file changed

+25
-20
lines changed

example/tests/test_serializers.py

+25-20
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111
from rest_framework_json_api.serializers import (
1212
DateField,
1313
ModelSerializer,
14-
ResourceIdentifierObjectSerializer
14+
ResourceIdentifierObjectSerializer,
15+
empty,
1516
)
1617
from rest_framework_json_api.utils import format_resource_type
1718

@@ -209,29 +210,33 @@ def test_polymorphic_model_serializer_passes_instance_to_child(self):
209210
Ensure that `PolymorphicModelSerializer` is passing the instance to the
210211
child serializer when initializing them
211212
"""
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+
)
214218

215-
def save(serializer_self):
219+
# Override `__init__` with our own method
220+
def init_with_asserts(child_self, instance=None, data=empty, **kwargs):
216221
"""
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
219225
"""
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+
)
222234

223-
# Override `save` with our own method
224-
ArtProjectSerializer.save = save
235+
ArtProjectSerializer.__init__ = init_with_asserts
225236

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)
232238

233-
# Act
234-
serializer.save()
239+
# Run save to force `ProjectSerializer` to init `ArtProjectSerializer`
240+
parent_serializer.save()
235241

236-
# Assert
237-
assert self.serializer_instance is not None
242+
# Asserts in the overridden `__init__` method declared above

0 commit comments

Comments
 (0)