首页 > 解决方案 > 在 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> '

所以我的两个问题是:

  1. 什么是解决方案?我可以忽略 HTML 的某些部分吗?
  2. 在测试 Django 应用程序时,测试 HTML 的内容是一个好习惯吗?我应该以不同的方式进行测试吗?

标签: pythondjangotesting

解决方案


您可以使用self.assertContains(result, "abcd")断言页面包含给定的字符串,例如显示here

我认为测试 HTML 的内容没有任何问题。您的视图包含更改 html 的逻辑。您的 .html 文件还可以包含模板逻辑。这需要与代码的其他部分一起进行测试。


推荐阅读