python - 在 Django 中对 REST 端点进行单元测试

标签 python django testing

总体而言,我对 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 的内容是一种好的做法吗?我应该改为以不同的方式进行测试吗?

最佳答案

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

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

关于python - 在 Django 中对 REST 端点进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53364546/

相关文章:

javascript - django 和 d3.tsv,不工作

ruby-on-rails - 测试每个 View 搜索或缺少翻译 span.translation_missing

python - 从 Adob​​e Premiere/Encoder in Python 和 FFMPEG 中生成的 MP4 获取时间码

Python将元组转换为数组

python - 将 python 脚本的所有参数传播到函数的最佳方法

mysql - django + mysql,存储 ip 地址,包括范围

python - request.POST 中的每个值都是一个列表

python - NameError:设置更改为mysql后未定义名称 '_mysql'

c++ - 如何在 C 代码上从终端运行 Google 测试?

.net - 在每次构建时在构建机器中执行集成测试或只是单元测试是正常的吗?