2 回答
TA贡献1856条经验 获得超11个赞
很棒的书,可以用来学习 Django!您的错误来源基于 csrf_token 标签的功能,可以在此处找到有关其工作原理的文档。简而言之,每个会话都有自己的 csrf 令牌,以确保请求来自您的网页本身,而不仅仅是从其他地方发布到您的服务器。考虑到这一点,对页面的请求和呈现为字符串的模板应该具有不同的内容。
你会在那本书中看到很多的一点是问自己这个测试是什么?对于这种情况,您似乎想检查所呈现的模板是否是您期望的模板,为此您可能希望对reponse.templates而不是 进行断言response.content.decode
。
如果您遵循该建议,它将最终看起来像:
self.assertEqual(response.templates[0].name, 'home.html')
TA贡献1876条经验 获得超6个赞
解决方案是模拟令牌生成函数,以便在需要比较输出的相等性时它具有可预测的值。
例如,下面的代码块将确保 html 输出包含<input type="hidden" name="csrfmiddlewaretoken" value="predicabletoken">而不是随机令牌字符串。
from unittest import mock
from django.test import TestCase
@mock.patch('django.template.context_processors.get_token', mock.Mock(return_value='predicabletoken'))
class HomeTests(TestCase):
def test_home_page_returns_correct_html(self):
request = HttpRequest()
response = home_page(request)
expected_html = render_to_string('home.html')
print('response: ', response.content.decode())
print('expected: ', expected_html)
self.assertEqual(response.content.decode(), expected_html)
添加回答
举报