Python Django测试:测试表单字段的初始值

Python Django测试:测试表单字段的初始值,python,django,django-testing,Python,Django,Django Testing,我有一个视图,它应该基于GET值为表单字段设置初始值。我想测试一下。我目前正在使用,但我愿意看看其他工具 编辑 很抱歉,我没有提到我很了解这个方法,但我希望有一个更好的方法,而不是在HTML中搜索输入标记和值属性。该值将作为一个参数嵌入HTML中。您可以使用您喜欢的任何工具搜索该字符串 response = Client().get('/customer/details/') print [line for line in response.split('\n') if line.find('&

我有一个视图,它应该基于GET值为表单字段设置初始值。我想测试一下。我目前正在使用,但我愿意看看其他工具

编辑
很抱歉,我没有提到我很了解这个方法,但我希望有一个更好的方法,而不是在HTML中搜索
输入
标记和
属性。

该值将作为一个参数嵌入HTML中。您可以使用您喜欢的任何工具搜索该字符串

response = Client().get('/customer/details/')
print [line for line in response.split('\n') if line.find('<input') > -1]
response=Client().get('/customer/details/'))

打印响应中的[行对行]。如果line.find,则拆分('\n')(“我认为这项功能是1.3版附带的,但它可能早就出现了。为了满足您的需求,我稍微修改了页面上的示例,但这是未经测试的代码,并且我假设了一些事情,比如响应上下文的表单参数。根据需要进行修改。这个答案的目的是显示请求工厂


我讨厌回答我自己的问题(就像我第三次这样做),但在与测试客户机进行模拟之后,我找到了一个更好的方法:

def test_creating_stop(self):
    c = self.client

    # Check that name is pre-filled
    response = c.get('%s?name=abcd' % reverse('add_new_stop'))
    self.assertEqual(response.context['form'].initial['name'], 'abcd')

有人看到这有什么问题吗?我将暂时搁置,看看人们怎么想。

接受的解决方案检查表单上的
初始[''''']
值,但您也可以检查字段上的实际值。伪代码如下

如果要测试直接来自模型的默认值(未设置form.initial),并确保
initial['…']
是实际值,这将非常有用

def test_some_default_value(self):
        response = self.client.get('/signup/')
        self.assertEquals(response.context['form']['plan'].value(), my_value)

def test_some_default_value_2(self):
        some_different_conditions...
        response = self.client.get('/signup/')
        self.assertEquals(response.context['form']['plan'].value(), a_different_value)

如果严格检查表单字段的初始值,另一种选择是测试表单:

forms.py

from django import forms

class MyForm(forms.Form):
    title = forms.CharField(initial='My Default Title')
测试表单.py

from django.test import TestCase
from .forms import MyForm

class MyFormTests(TestCase):
    def test_myform_initial_value(self):
        form = MyForm()
        self.assertEqual(form['title'].initial, 'My Default Title')

+1谢谢Nate。不过,我希望有一种比搜索HTML源代码更好的方法。编辑了这个问题。这至少有两个原因是错误的:一个是你使用的是绝对URL,而不是执行
反向
URL查找,另一个是当Django测试使上下文更容易获得时,你正在删除HTML。嗯,你会这样做的那么,我必须创建解析树,对吗?django发出响应后,它基本上完成了。你可以使用类似BeautifulSoup或其他html解析器。但对我来说,至少在你声明的情况下,它只是运行额外的周期来检查你想要的文本。下面是一个如何解析
response.content
和使用Django TestClient中的数据:这正是我要建议的。我也是这样做的:)您是否发现尝试获取
response.context['form'].initial
其中有ForeignKeys/M2M,通过post反馈会有问题吗?它希望id不是对象..这就是我要找的。值得注意的是,如果您正在测试Django管理员页面,您需要访问
response.context['adminform'].form.initial
from django.test import TestCase
from .forms import MyForm

class MyFormTests(TestCase):
    def test_myform_initial_value(self):
        form = MyForm()
        self.assertEqual(form['title'].initial, 'My Default Title')