【问题标题】:Tests for views in Django application测试 Django 应用程序中的视图
【发布时间】:2014-08-02 20:31:35
【问题描述】:

我的models.py 中的模型很少。其中两个如下:

class Event():
      eventName = models.CharField( unique = True )

class Job():
      event = models.ForeignKey(Event)
      jobName = models.CharField

      class Meta:
          unique_together(('event','jobName'))

我正在使用来自django.testClient module 测试此类的模型形式。我失败的测试是在测试unique_together 属性时

以下是我的test.py

class TestJobView(TestCase):
    def test_duplicate_job_in_same_event(self):
        Event.objects.create(eventName='test_event', noOfVolunteersRequired=10,
                startDate='2014-05-05 05:05:05', endDate='2014-05-05 05:05:05')

        Job.objects.create(event=Event.objects.get(eventName='test_event'),
                   jobName='test_jobName',jobDescription='test_jobDescription_1',
                   noOfVolunteersRequired=10, startDate='2014-05-05 05:05:05', 
                   endDate='2014-05-05 05:05:05')
        self.assertEqual(1, Job.objects.filter(event__eventName='test_event', 
                           jobName='test_jobName').count())

        c = Client()

        response = c.post('/AdminUnit/job/',{'event' : 'test_event',
        'jobName' : 'test_jobName','jobDescription' : 'test_jobDescription_2',
        'startDate' : '2014-05-05 05:05:05', 'endDate' : '2014-05-05 05:05:05', 
        'noOfVolunteersRequired' : 5})

        self.assertEqual(200, response.status_code)
        print response.context['jobsForm']['event'].errors

上面的测试结果打印Select a valid choice. That choice is not one of the available choices.

现在,我有两个问题。首先,不应引发此异常,因为已创建事件并且在上述方法中也是asserted True。其次,如果我从我的角度尝试同样的事情,它会引发 non_field_error 并说 Job with this Event and JobName already exists. 。如何使用 response 在我的 tests.py 中捕获这一点?

【问题讨论】:

    标签: python django functional-testing


    【解决方案1】:

    您没有显示您的视图或表单,但大概您只是使用默认的 ModelForm,它将 ForeignKey 表示为 ModelChoiceField。因此,event 发布的值不是名称,而是 ID,您应该在测试开始时创建事件时捕获它。

    不过,我应该补充一点,我认为您根本不应该对此进行测试。单元测试适用于您的代码,而不是 Django 的。 unique_together 是 Django 本身的一部分,因此被 Django 自己的单元测试很好地覆盖。您无需显式复制该功能。

    编辑

    我不明白你的第二条评论。您的测试应如下所示:

    def test_duplicate_job_in_same_event(self):
        event = Event.objects.create(...)
        job = Job.objects.create(event=event, ...)
        response = self.client.post('/AdminUnit/job/',{'event' : event.id, ...})
    

    【讨论】:

    • 是的,你是对的,我只是在使用 ModelForm 。对不起,我是 django 的新手,因此没有你的 ID 部分。能否请您详细说明一下
    • 补充一点,event 是名称,id_event 是事件字段的 ID。我通过print response 进行了检查。我也在其他地方使用相同的概念,因此确定它是名称而不是 ID
    • 谢谢,我明白了你的 id 和 name 的意思。此外,即使我为此视图编写测试(回归测试),也会引发non_field_error。如何在我的 tests.py 中访问它。例如,我们访问诸如response.context['jobsForm']['event'].errors 之类的字段错误
    • response.context['jobsForm'].non_field_errors() 是我想要的。谢谢:)
    【解决方案2】:

    Daniel Roseman 注意到,unique_together 不应该在这里测试。是否应该进行测试是一个见仁见智的问题。但是,unique_together 是在模型级别定义的,幸运的是,当您在那里对其进行单元测试时,一切都变得更加简单:

    class TestJob(TestCase):
        def test_duplicate_in_same_event(self):
            event = Event.objects.create(
                eventName='test_event', noOfVolunteersRequired=10,
                startDate='2014-05-05 05:05:05', endDate='2014-05-05 05:05:05')
    
            Job.objects.create(
                event=event,
                jobName='test_jobName',jobDescription='test_jobDescription_1',
                noOfVolunteersRequired=10, startDate='2014-05-05 05:05:05', 
                endDate='2014-05-05 05:05:05')
    
            job = Job(
                event=event,
                jobName='test_jobName',jobDescription='test_jobDescription_1',
                noOfVolunteersRequired=10, startDate='2014-05-05 05:05:05', 
                endDate='2014-05-05 05:05:05')
    
            with self.assertRaises(ValidationError):
                job.validate_unique()
    

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2021-08-26
      • 2014-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多