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
,但这取决于您的应用程序。
我正在使用自定义模板标签来计算货币值,货币是从 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
,但这取决于您的应用程序。