#29308 closed Cleanup/optimization (fixed)
Clarify how assertQuerysetEqual()'s transform parameter works
Reported by: | Alexander Todorov | Owned by: | Jacob Walls |
---|---|---|---|
Component: | Documentation | Version: | 2.0 |
Severity: | Normal | Keywords: | |
Cc: | shubham singh | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | yes | UI/UX: | no |
Description (last modified by )
According to:
https://docs.djangoproject.com/en/2.0/topics/testing/tools/#django.test.TransactionTestCase.assertQuerysetEqual
Asserts that a queryset
qs
returns a particular list of valuesvalues
.
The comparison of the contents of
qs
andvalues
is performed using the functiontransform
;
The way I read this is that this assert method receives a queryset and a list parameters and compares their contents for equality. By default it will use repr
to do that but the user can change this. The way the docs are written suggests that the transform
function is applied to both the queryset and the values
list. In other words in my tests I can write:
self.assertQuerysetEqual(some_query_taken_from_request_context, [test_object1, test_object2, etc])
The tutorial doesn't use the above but instead hard codes string representations in the tests:
https://docs.djangoproject.com/en/2.0/intro/tutorial05/#testing-our-new-view
IMO this is less optimal, makes test suites more fragile (dependent on repr()) and less intuitive b/c the expected value isn't a list of the actual objects but a list of their representation which may have been obtained elsewhere.
Note: this may sounds like an RFE but if we trust the docs it's a bug.
Note2: I can contribute a PR for this and update the existing test suite & docs. Just let me know how you feel about it.
Change History (7)
comment:1 by , 7 years ago
Component: | Testing framework → Documentation |
---|---|
Description: | modified (diff) |
Summary: | Testing: assertQuerysetEqual's transform parameter not applied to the values parameter → Clarify how assertQuerysetEqual()'s transform parameter works |
Triage Stage: | Unreviewed → Accepted |
Type: | Bug → Cleanup/optimization |
comment:2 by , 5 years ago
Cc: | added |
---|---|
Owner: | changed from | to
Status: | new → assigned |
comment:3 by , 4 years ago
Has patch: | set |
---|---|
Owner: | changed from | to
Hi Shubham Singh, hope it's alright that I submitted a tiny patch for this.
comment:4 by , 4 years ago
Easy pickings: | set |
---|
As someone who knows how the
transform
parameter works, the documentation is unclear to me. Changing behavior would be backwards incompatible.For the use case you mentioned, it would also be useful to recommend
assertSequenceEqual(queryset, [obj1, obj2, ...])
andassertCountEqual()
as these are simpler thanassertQuerysetEqual()
.