python - 在 Django 应用程序中测试 View

标签 python django functional-testing

我的 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.test 中的 Client 模块 测试此类的模型形式。我失败的测试是在测试 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。该选项不是可用选项之一。

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

最佳答案

您没有显示您的 View 或表单,但大概您只是在使用默认的 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, ...})

关于python - 在 Django 应用程序中测试 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25099157/

相关文章:

python - 创建新列时日期转换不起作用

python - 如何在 Keras Python 中合并多个顺序模型?

jquery - Django 。 ajax调用后数量不会增加

html - Django 模板继承导致总线错误

python - Selenium send_keys 卡在 Python 上

python - 如何在 python 2.x 交互模式下将参数传递给模块

Python:使 numpy 默认为 float32

python - django 搜索表单 UnboundLocalError at/

testing - 开源测试用例管理工具

android - 如何通过 Android 的 ant 构建脚本运行单个测试用例?