我正在尝试编写一个单元测试,该单元测试将测试遵循Django最新的简化URL路由语法的URLconf。此语法允许捕获的值包括转换器类型。但是我发现转换器类型似乎不起作用。
这是我要测试的URLconf:
urlpatterns = [
path('club/<int:club_id>/', login_required(views.show_club), {'template': 'show_club.html'}, name='show-club'),
...
]
如您所见,我想将俱乐部ID传递为整数。现在是我的测试:
class TestURLs(TestCase):
def test_show_club(self):
path = reverse('show-club', kwargs={'club_id': 10})
match = resolve(path)
assert match.view_name == 'show-club'
assert 'club_id' in match.kwargs
assert match.kwargs['club_id'] == 10
运行此测试时,我在第三个断言上收到断言错误:
File... in test_show_club assert match.kwargs['club_id'] == 10
AssertionError
如果我在代码中插入set_trace并检查match变量,则可以看到断言失败,因为club_id键包含字符串值'10':
ResolverMatch(func=activities.views.show_club, args=(), kwargs={'club_id': '10', 'template': 'show_club.html'...})
如果我的转换器类型为<int:club_id>
,则kwargs ['club_id']是否应包含整数值10而不是字符串'10'?
我还在代码中插入了一个set_trace,然后通过该视图运行代码。当我做print(type(club_id))
时,我还发现传入的值是一个字符串。为什么此整数转换器类型不能像广告中那样工作?我正在使用Django 2.0.13,并且正在升级到Django 2.2。
更新
我感谢Daniel Roseman的回复。如果他说的是正确的,则说明文件似乎不正确。 documentation说,
新语法支持URL参数的类型强制。在里面 例如,该视图将接收year关键字参数作为整数 而不是字符串。
是说视图将以整数形式接收参数,而不是字符串。 Wikipedia上的“类型强制”的定义支持:
在计算机科学中,类型转换,类型转换,类型 强制和类型变戏法是改变 从一种数据类型到另一种数据类型的表达式。一个例子是 将整数值转换为浮点值或其 文本表示形式为字符串,反之亦然。
也许我只是没有正确阅读它。但是,如果文档不正确,则在测试中检查kwarg的类型毫无意义。
答案 0 :(得分:0)
不,不是那样的。参数将始终是字符串。转换器仅确保其格式正确,即仅包含数字。
编辑,因为我想我知道混乱的根源。它不是 type 转换器,而是 pattern 转换器。它将<int:club_id>
转换为等效的正则表达式(?P<club_id>\d+)
。