#29308: Clarify how assertQuerysetEqual()'s transform parameter works
--------------------------------------+------------------------------------
     Reporter:  Alexander Todorov     |                    Owner:  nobody
         Type:  Cleanup/optimization  |                   Status:  new
    Component:  Documentation         |                  Version:  2.0
     Severity:  Normal                |               Resolution:
     Keywords:                        |             Triage Stage:  Accepted
    Has patch:  0                     |      Needs documentation:  0
  Needs tests:  0                     |  Patch needs improvement:  0
Easy pickings:  0                     |                    UI/UX:  0
--------------------------------------+------------------------------------
Changes (by Tim Graham):

 * type:  Bug => Cleanup/optimization
 * stage:  Unreviewed => Accepted
 * component:  Testing framework => Documentation


Old description:

> 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 values
> `values`.
> >
> > The comparison of the contents of `qs` and `values` is performed using
> the function `transform`;
>
> 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.

New description:

 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 values
 `values`.
 >
 > The comparison of the contents of `qs` and `values` is performed using
 the function `transform`;

 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.

--

Comment:

 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, ...])` and
 `assertCountEqual()` as these are simpler than `assertQuerysetEqual()`.

-- 
Ticket URL: <https://code.djangoproject.com/ticket/29308#comment:1>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/066.5a8b07c632ff74c991219a649249553f%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to