我的 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/