【发布时间】:2016-06-05 13:45:06
【问题描述】:
因此,在将预期与实际 html 与表单输入进行比较时,我一直在 Django 中返回失败测试,因此我打印出结果并意识到差异是由我的{% csrf_token %} 引起的相当简单的行,如下所示:
<input type='hidden' name='csrfmiddlewaretoken' value='hrPLKVOlhAIXmxcHI4XaFjqgEAMCTfUa' />
所以,我期待一个简单的答案,但我一直没能找到它: 如何渲染 csrf_token 的结果以用于测试?
这是测试设置和失败:
def test_home_page_returns_correct_html_with_POST(self):
request = HttpRequest()
request.method = 'POST'
request.POST['item_text'] = 'A new list item'
response = home_page(request)
self.assertIn('A new list item', response.content.decode())
expected_html = render_to_string(
'home.html',
{'new_item_text': 'A new list item'},
******this is where I'm hoping for a simple one-line mapping******
)
self.assertEqual(response.content.decode(), expected_html)
这是来自views.py的渲染:
def home_page(request):
return render(request, 'home.html', {
'new_item_text': request.POST.get('item_text'),
})
这是测试失败,当我使用 python manage.py test 运行测试时
FAIL: test_home_page_returns_correct_html_with_POST (lists.tests.HomePageTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\Users\Me\PycharmProjects\superlists\lists\tests.py", line 29, in test_home_page_returns_correct_html_with_POST
self.assertEqual(response.content.decode(), expected_html)
AssertionError: '<!DO[298 chars] <input type=\'hidden\' name=\'csrfmiddlew[179 chars]tml>' != '<!DO[298 chars] \n </form>\n\n <table
id="id_list_t[82 chars]tml>'
----------------------------------------------------------------------
【问题讨论】:
-
你能展示更多你的测试代码吗?默认情况下,如果您使用的是内置的 Django 测试客户端,这应该不是问题。根据文档,
By default, the test client will disable any CSRF checks performed by your site. -
我已更新问题以包括错误、设置等。我将检查刚刚发布的答案,看看它的表现如何。谢谢。
标签: python django tdd csrf django-csrf