django compare testcase django-queryset

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