2017-10-19 3 views
2

j'ai un modèle:Django: objet de classe n'a pas d'attribut de fonction standard

class Order(models.Model): 

    STATUS_CHOICES = (
     (100, 'First'), 
     (200, 'Second'), 
    ) 
    status = models.IntegerField('Status', choices=STATUS_CHOICES) 

    def accept(self): 
     self.status = 200 
     self.save() 
     return self.status, self.get_status_display() 

et moi avons une unité de test pour elle:

class CustomTestCase(TestCase): 

    @classmethod 
    def setUp(self): 
     pass 

    @classmethod 
    def save(self): 
     pass 


class OrderTest(CustomTestCase): 

    def test_accept(self): 
     result = Order.accept(self) 
     expected = (200, 'Second') 

     self.assertEqual(expected, result) 

Comme vous pouvez le voir, j'ai ajouté ' sauver » fonction qui ne font rien, la raison en est que sans cette mesure « Enregistrer » fonction que je continue à obtenir cette erreur:

[OrderTest] object has no attribute [save]

S'il y a une meilleure solution à cette fonction de sauvegarde personnalisée, dites-le moi. Mais ce type de solution ne fonctionnera pas avec la fonction 'get_status_display()' de django. Et sans solution je continue à avoir ce problème:

[OrderTest] object has no attribute [get_status_display]

Que puis-je faire pour que cela fonctionne comme j'ai besoin?

+0

Devrait-il être passé à la fonction d'acceptation? Oder.accept()? –

+0

Dans ce cas, j'ai eu: "TypeError: accept() manquant 1 argument positionnel requis: 'self'" – Madi7

Répondre

5

Si vous voulez tester la méthode accept, il suffit de créer un nouvel ordre comme celui-ci:

def test_accept(self): 
    order = Order.objects.create(status=100) 
    result = order.accept() 
    expected = (200, 'Second') 
    self.assertEqual(expected, result) 

La raison pour laquelle vous avez obtenu l'erreur [OrderTest] object has no attribute [save] vous est passe l'objet de test dans la méthode accept (dans "Order.accept(self) "), donc quand self.save() est appelé, il cherche réellement la méthode save de la classe de test.

Espérons que cela aide.

+1

Merci beaucoup! Mais je ne comprends pas une chose, quel est le but de la moquerie, si je dois créer des objets pour les tester? Par exemple j'ai essayé de faire ceci: order = Mock (spec = Order) et cela n'a pas fonctionné, cependant: order = Order.objects.create (status = 100) a fonctionné parfaitement. Si je dois créer de nouveaux objets via 'Model.objects.create' pour chaque test unitaire, pourquoi utiliser même des moqueurs? – Madi7

+0

@ Madi7 https://stackoverflow.com/questions/3622455/what-is-the-purpose-of-mock-objects –