comparando querysets en django TestCase
compare django-queryset (3)
Encontré una solución. Necesitamos convertir Querysets
en listas ordenadas antes de poder compararlos. Algo como sigue.
Class SomeTestCase(TestCase):
# ...
def test_simple_view(self):
# ... some other checks
docset1 = self.resonse.context[''documents'']
docset2 = self.user.document_set.all()
self.assertTrue(list(sorted(docset1)) == len(sorted(docset)))
# ...
Tengo una vista muy simple como sigue
def simple_view(request):
documents = request.user.document_set.all()
return render(request, ''simple.html'', {''documents'': documents})
Para probar la vista anterior en mi caso de prueba, tengo el siguiente método que elimina los errores.
Class SomeTestCase(TestCase):
# ...
def test_simple_view(self):
# ... some other checks
docset = self.resonse.context[''documents'']
self.assertTrue(self.user.document_set.all() == docset) # This line raises an error
# ...
El error que recibo es AssertionError: False is not true
. He intentado imprimir los querysets y ambos son absolutamente idénticos. ¿Por qué devolvería False
cuando ambos objetos son idénticos? Algunas ideas ?
Actualmente para superar esto, estoy usando un truco desagradable de verificación de longitudes como sigue:
ds1, ds2 = self.response.context[''documents''], self.user.document_set.all()
self.assertTrue(len([x for x in ds1 if x in ds2]) == len(ds1) == len(ds2)) # Makes sure each entry in ds1 exists in ds2
Esta alternativa no necesita ordenación:
self.assertQuerysetEqual(qs1, list(qs2), ordered=False)
Ver la referencia de afirmación .
Nota: Solo para django 1.4+.
Los objetos queryset no serán idénticos si son el resultado de diferentes consultas, incluso si tienen los mismos valores en su resultado (compare ds1.query
y ds2.query
).
Si primero convierte el conjunto de consultas a una lista, debería poder hacer una comparación normal (asumiendo que tienen el mismo orden de clasificación):
self.assertEqual(list(ds1), list(ds2))