python - 在 Django 中对 REST 端点进行单元测试
问题描述
总的来说,我对 Django 和 Web 开发还很陌生。我决定通过创建一个简单的网络应用程序来发布和显示大学评论来学习。我有许多要测试的 GET 和 POST 端点。
过去,我开发了 API,其中端点返回 JSON 对象,我可以在进行 API 端点测试时对其进行断言。但是,在这种情况下,我的 Django 应用程序返回 HTML。
我遇到的第一个问题是我的 HTML 有时包含我无法断言的动态值。例如,csrf_token
位于我的表单中的。这是大学详细信息页面的 HTML 文件的一部分:
...
<form action="{% url 'university_add_review' university.id %}" method="post">
{% csrf_token %}
<p>Date:</p><input type="date" name="date" id="date"/>
<p>Summary:</p><textarea name="summary" id="summary">Enter your summary here.</textarea>
<input type="submit" value="Submit"/>
</form>
...
在我的单元测试中,我想检查对该GET
页面的请求是否获得了正确的内容:
def test_get_university_details(self):
response = Client().get('/%s/overview/' % self.university.id)
self.assertEqual(response.content, expected)
expected
预期的 HTML在哪里。但是,这失败了,因为csrf_token
每个GET
请求都不同,所以我无法获得预期值。结果,此测试失败:
Traceback (most recent call last):
File ".../tests.py", line 47, in test_get_university_details
self.assertEqual(response.content, expected)
AssertionError: b'\n\[384 chars]ue=\'wrG24VMcdpYYOMECnibQrElP1km9YU0WeOMedGJ2C[488 chars]orm>' != b'\n\[384 chars]ue=\'QWCWACcNQwbfOx9M3iLFt77nSIKhUMiK5i1I4a5mD[530 chars]on> '
所以我的两个问题是:
- 什么是解决方案?我可以忽略 HTML 的某些部分吗?
- 在测试 Django 应用程序时,测试 HTML 的内容是一个好习惯吗?我应该以不同的方式进行测试吗?
解决方案
您可以使用self.assertContains(result, "abcd")
断言页面包含给定的字符串,例如显示here
我认为测试 HTML 的内容没有任何问题。您的视图包含更改 html 的逻辑。您的 .html 文件还可以包含模板逻辑。这需要与代码的其他部分一起进行测试。
推荐阅读
- firebase - Firebase:结合查询和子事件监听器
- php - 看不到 PHP 代码的语法错误
- css - 自定义帖子类型按日期和时间排序 - Wordpress
- python-3.x - python 3.6的if语句和else
- java - 在数据库中保存 BCryptPasswordEncoder 时出错
- c# - 创建自定义 Button 控件的最节省内存的方法是什么?
- vba - 在每个单元格 Excel 中使用 VBA 而不是使用公式(索引和匹配)
- tensorflow - tensorflow:处理可变长度张量
- php - 如何将行中的单词与php进行比较?
- facebook-javascript-sdk - 如何生成 Facebook 分享按钮以动态获取内容?