2016-08-02 14 views
0

Ich frage mich, was die beste Vorgehensweise ist, um Code für gutes Testen zu schreiben. Z.B.Testen von Django und Modellmethoden

class Visits(models.Model): 
    user = models.ForeignKey(User) 
    visited_at = models.DateTimeField() 

    def __unicode__(self): 
     return "{}-{}".format(self.user, self.visited_at) 

Und ich brauche eine Funktion, die mich nur Besuche für aktuelle Benutzer vom letzten Tag erhalten. Was soll ich machen? Sehen Sie sich das an und testen Sie es? Oder machen Sie Modellmethoden? Was ist am besten zu testen?

Antwort

0

Als Erstes könnten Sie einen Modellmanager dafür verwenden. Sollte etwas ähnlich dem Folgenden aussehen.

(Dies ist nicht getestet, können Sie mit dem querysets zu verwirren haben):

managers.py

from django.db import models 

class Visited(models.Manager): 

    def on_day(self, user, date): 
     qs = self.model.objects.filter(user=user, visited_at=date) 
     return qs 

models.py

from django.db import models 
from .managers import Visited 

class Visits(models.Model): 
    user = models.ForeignKey(User) 
    visited_at = models.DateTimeField() 
    objects = models.Manager()  
    visited = Visited() 

    def __unicode__(self): 
     return "{}-{}".format(self.user, self.visited_at) 

einfach füttern Sie es die user und date Informationen, die es th zurückgeben muss e gewünschte User eingestellt.


Wie für die Prüfung, hoffentlich jemand etwas ordnungsgemäße in Dokumentation schreiben kann, denn es gibt viel ich darüber erfahren möchte, aber dies ist in der Regel, wie ich über sie gehen mag:

tests.py

import datetime 
from django.test import TestCase 

class TestData(TestCase): 
    yesterday = datetime.date.today() - datetime.timedelta(days=1) 

    @classmethod 
    def setUpTestData(cls): 

     cls.User1 = User.objects.create(
      name="Anon1" 
     ) 
     cls.User2 = User.objects.create(
      name="Anon2" 
     ) 

     cls.Visit1 = Visits.objects.create(
      user=cls.user1, 
      visited_at=self.yesterday, 
     ) 
     cls.Visit2 = Visits.objects.create(
      user=cls.user2, 
      visited_at=datetime.date(2016,7,28), 
     ) 
     cls.Visit3 = Visits.objects.create(
      user=cls.user2, 
      visited_at=datetime.date(2016,8,1), 
     ) 

class SalesRecordTest(TestData): 

    def test_varieties_sold(self): 
     self.assertQuerysetEqual(Visits.visited.on_day(self.yesterday, self.user), ["<User: Anon1>"]) 
     self.assertNotIn("Anon2", str(Visits.visited.on_day(self.yesterday, self.user))) 

Flagge Ihre Tests mit --keepdb ihnen rasche zu halten. Ich habe keinen Nachteil gefunden, nur --keepdb jedes Mal zu verwenden, da es scheint, die Datenbank zu aktualisieren, wann immer es erforderlich ist.

Hoffentlich ist dies genug, um loszulegen. Viel Glück und viel Spaß beim Testen!