django 测试一个使用请求的模板标签

django test a templatetag which uses the request

我正在使用自定义模板标签来计算货币值,货币是从 select 元素中选择的。当用户选择他想要使用的货币时,我会在会话中保存所选货币并刷新页面。

模板标签显示为所选货币计算的值。

在任何模板中

{% load currency %}
{% set_currency request 156 %}

在my_app/templatetags/currency.py

from django.conf import settings
from djmoney_rates.utils import convert_money
register = template.Library()

@register.inclusion_tag('includes/price.html')
def set_currency(request, price):
    # currency_session could be 'USD', 'EUR' ...
    currency_session = request.session.get(settings.CURRENCY_SESSION_KEY, settings.DEFAULT_CURRENCY)
    money = convert_money(price, settings.DEFAULT_CURRENCY, currency_session)
    return {'amount': '%d' % money.amount, 'currency': money.currency}

includes/price.html 就是

<span class="amount">{{amount}}</span>
<span class="currency">{{currency}}</span>

现在我想知道如何测试这个模板标签,如何传递请求,以及如何使会话存在于该请求中。

我只会测试功能。

from django.test import TestCase, RequestFactory
from django.conf import settings
from my_app.templatetags.currency import set_currency

class SetCurrencyTestCase(TestCase):

    def setUp(self):
        self.factory = RequestFactory()

    def test_set_currency(self):
        request = self.factory.get('/any/path/really/')
        request.session = {
            settings.CURRENCY_SESSION_KEY: settings.DEFAULT_CURRENCY
        }

        response = set_currency(request, 156)

        self.assertEqual(response['amount'], 42)
        self.assertEqual(response['currency'], 'BTC')

我也会考虑在不使用 settings 的情况下设置 request.session,但这取决于您的应用程序。