2016-05-03 17 views
1

Ich versuche, einen Modell-Unittest für eine ManyToMany-Beziehung zu erstellen. Ziel ist es zu prüfen, ob in der Tabelle Inhaltsstoff die richtige Kategorie gespeichert ist.TestCase self.assertEqual stimmt nicht mit einer ähnlichen Zeichenfolge überein

class IngredientModelTest(TestCase): 
    def test_db_saves_ingredient_with_category(self): 
     category_one = IngredientsCategory.objects.create(name='Food') 
     first_Ingredient = Ingredient.objects.create(name='Apple') 
     first_Ingredient.categories.add(category_one) 

     category_two = IngredientsCategory.objects.create(name='Medicine') 
     second_Ingredient = Ingredient.objects.create(name='Antibiotics') 
     second_Ingredient.categories.add(category_two) 

     first_ = Ingredient.objects.first() 
     self.assertEqual('Apple', first_.name) 
     self.assertEqual(first_.categories.all(), [category_one]) 
     self.assertEqual(first_, first_Ingredient) 

für self.asserEqual(first_.categories.all(), [category_one]) in der vorletzten Reihe bekomme ich diese seltsame assert:

AssertionError: [<IngredientsCategory: Food>] != [<IngredientsCategory: Food>] 

ich viele andere verschiedene Arten versucht, aber nichts davon funktionierte. Will jemand annehmen, wie ich die Information von first_.categories.all() bekommen kann, um es mit etwas anderem zu vergleichen?

+1

Es ist sehr wahrscheinlich, weil der Typen passen nicht. all() gibt queryset zurück und vergleicht es mit einer Liste. Hast du es überprüft? – Heval

+0

Versuchen Sie 'self.assertEqual (first_.categories.get(), category_one)', wenn Sie testen möchten, dass dort nur ein Ergebnis vorhanden ist. – Ben

Antwort

1

das sein werden, weil sie nicht gleich sind - ein ein QuerySet ist, ist der andere ein list - sie nur zufällig die gleichen str Darstellungen haben.

Sie könnten entweder werfen die QuerySet auf eine Liste mit list(first_.categories.all()) oder eine mögliche Lösung für diese Situation sein kann:

self.assertEqual(first_.categories.get(), category_one) 
+0

Danke für die Hilfe. Und das ist für diejenigen, die mit dem gleichen Problem kommen und mehr als einen 'QuerySet' Wert vergleichen wollen. Zumindest habe ich herausgefunden, wie es in meinem Fall funktioniert: 'self.assertEqual ([Wert für Wert in last_.categories.all()], [category_one, category_zwei,])' –

+0

Keine Sorge. Sie können einfach 'list (last_.categories.all())' anstelle des Listenverständnisses verwenden, wenn Sie bevorzugen. – Ben

+0

Schön. Ja, das sieht viel besser aus –