python 2.6 — django TestCase — метод assertRaises ValidationError clean ()

Джанго 1.5 и Python 2.6.

В модели есть метод clean(), который проверяет, что job.company_id должно быть равно job.location.company_id.

Я пытаюсь написать тест для этого, но вместо того, чтобы пройти/не пройти тест, тест заканчивается сообщением об ошибке проверки из метода clean() модели.

Вот код (несущественные биты опущены):

В моделях.py:

class Job(models.Model):
    title = models.CharField(max_length=200, verbose_name="Job title")
    company = models.ForeignKey(Company)    
    location = models.ForeignKey(Location, blank=True, null=True)

    def clean(self):
        from django.core.exceptions import ValidationError
        '''
        Location.company_id must equal Job.company_id
        '''
        if (self.company_id != Location.objects.get(pk=self.location_id).company_id):
            raise ValidationError('Location is not valid for company')

В тестах.py:

class job_cannot_have_invalid_location_and_can_have_valid_location(TestCase):
    def test_jobs_and_locations(self):
        job2 = Job.objects.create(company_id=company2.id)
        location1 = Location.objects.create(company_id=company1.id)
        job2.location_id = location1.id
        self.assertRaises(ValidationError, job2.clean())

Когда я запускаю тест python manage.py:

.E.
======================================================================
ERROR: test_jobs_and_locations     (companies.tests.job_cannot_have_invalid_location_and_can_have_valid_location)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/djangobox/jobboard/companies/tests.py", line 60, in test_jobs_and_locations
    self.assertRaises(ValidationError, job2.clean())
  File "/home/djangobox/jobboard/companies/models.py", line 151, in clean
    raise ValidationError('Location is not valid for company')
ValidationError: [u'Location is not valid for company']

person billrichards    schedule 03.12.2013    source источник


Ответы (1)


Проблема в том, что вы используете assertRaises. Он должен принимать исключение и вызываемый объект для проверки: http://docs.python.org/2/library/unittest.html#unittest.TestCase.assertRaises

Однако вы не передаете вызываемый job2.clean, вы передаете возвращаемое значение вызываемого job2.clean(). Изменение вызова на

self.assertRaises(ValidationError, job2.clean)

должен исправить исключение и ваш тестовый пример.

person Mark Lavin    schedule 03.12.2013