总体而言,我对 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 内容有任何问题。您的 View 包含改变 html 的逻辑。您的 .html 文件还可以包含模板逻辑。这需要与代码的其他部分一起进行测试。
关于python - 在 Django 中对 REST 端点进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53364546/