如何测试 HTMX Get 请求?

dsc*_*ose 5 testing django tdd http htmx

我正在使用 Django 和 HTMX。我的一个视图收到 GET 请求并返回整个页面。但是,如果该 GET 请求来自 HTMX 元素,则视图将返回一个片段:

from django.shortcuts import render

def view_example(request):
    if request.htmx:
        return render(request, 'fragment.html')
    else:
        return render(request, 'page.html')
Run Code Online (Sandbox Code Playgroud)

page.htmlHTMX 元素中触发需要此片段的 GET 请求。它有效 - 我的功能测试看到 HTMX 请求的结果。当我在浏览器中查看它时,它也有效。但它在我的单元测试中不起作用!

我正在尝试测试两种不同类型的响应:

from django.test import TestCase

class TestRequests(TestCase):
    def test_page(self):
        response = self.client.get('/')
        self.assertTemplateUsed(response, 'page.html')

    def test_fragment(self):
        headers = {'Hx-Request': 'true'}
        response = self.client.get('/', **headers)
        self.assertTemplateUsed(response, 'fragment.html')
Run Code Online (Sandbox Code Playgroud)

test_page按预期通过,但test_fragment失败:

AssertionError:False 不是 true:模板“fragment.html”不是用于呈现响应的模板。实际使用的模板:page.html

如何模拟 HTMX 请求以便测试我的片段逻辑?

Dau*_*ros 6

Django-HTMX的标头检查区分大小写(它是字典键查找)。您必须使用大写设置HX-Request标题HX

def test_fragment(self):
    headers = {'HTTP_HX-Request': 'true'}
    response = self.client.get('/', **headers)
    self.assertTemplateUsed(response, 'fragment.html')
Run Code Online (Sandbox Code Playgroud)