2015-09-10 3 views
1

Я изучаю, как использовать Django Test Infrastructure. Очень часто трудно найти хороший тестовый пример.Django Test Case

Вот один тестовый пример в танго с учебником по Django.

class CategoryMethodTests(TestCase): 

    def test_ensure_views_are_positive(self): 

     """ 
     ensure_views_are_positive should results True for categories where views are zero or positive 
     """ 
     cat = Category(name='test',views=-1, likes=0) 
     cat.save() 
     self.assertEqual((cat.views >= 0), True) 

Вот класс Категория в models.py

class Category(models.Model): 
    name = models.CharField(max_length=128, unique=True) 
    views = models.IntegerField(default=0) 
    likes = models.IntegerField(default=0) 
    slug = models.SlugField(unique=True, default=uuid.uuid1) 

    def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 
     super(Category, self).save(*args, **kwargs) #python MRO 

    def __str__(self): 
     return self.name 

Я добавил эту строку в метод сохранения

def save(self, *args, **kwargs): 
     self.slug = slugify(self.name) 
     if self.views >=0: 
      super(Category, self).save(*args, **kwargs) #python MRO 

Тестовый пример до сих пор не удается. Есть два вопроса: 1. Как сделать пробный проход; 2. Как обращаться с корпусом else (self.views < 0)?

Благодарим Alasdair за быстрый ответ.

Последующие действия: Я тестирую домашнюю страницу под названием «Индекс». Вот код теста:

class IndexViewTests(TestCase): 
    def test_index_view_with_no_categories(self): 
     response = self.client.get(reverse('index')) 
     self.assertEqual(response.status_code, 200) 
     self.assertQuerysetEqual(response.context['categories'], []) 



    def **add_category**(name, views, likes): 
     c = Category.objects.get_or_create(name=name)[0] 
     c.views = views 
     c.likes = likes 
     c.save() 

    def test_index_view_with_categories(self): 
     add_category('test', 1, 1) 
     add_category('temp', 1, 1) 
     add_category('tmp', 1, 1) 
     add_category('tmp test temp', 1, 1) 

     response = self.client.get(reverse('index')) 
     self.assertEqual(response.status_code, 200) 
     self.assertContains(response, "tmp test temp") 

     num_cats = len(response.context['categories']) 
     self.assertEqual(num_cats, 4) 

Когда я запускаю тестовый случай, он не:

add_category ('тест', 1, 1) NameError: имя 'add_category' не определен

Категория add_ определена в классе IndexViewTests. Как эта ошибка будет исправлена? Благодарю.

ответ

0

Вы изменили метод save(), чтобы объект сохранялся только в базе данных, если представления больше или равны нулю.

Однако тест проверяет значение объекта, неважно, сохраняется ли объект в базе данных или нет.

Чтобы пройти тест, я попробую проверить количество просмотров в методе сохранения. Если оно меньше нуля, измените его на другое число (например, ноль). Наконец, вызовите метод save() вне оператора if.

+0

Спасибо, у меня есть продолжение по этому поводу, так как это тот же тестовый файл. – day

+0

Лучше не отмечать ответ как принятый, если у вас все еще есть вопрос, иначе никто его не увидит. Было бы также лучше задать отдельный вопрос, но на этот раз я быстро отвечу. В учебнике говорится, что 'add_categegory' должно быть функцией в тестовом файле, это не должно быть методом класса вида. Если бы это был метод, это было бы 'def add_category (self, name, ...)', и вы бы назвали его 'self.add_category ('test', ...)'. Если вы не знакомы с этим, было бы неплохо сделать некоторые обучающие программы для начинающих Python. – Alasdair