【问题标题】:NoReverseMatch with unittestNoReverseMatch 与 unittest
【发布时间】:2020-09-04 10:13:23
【问题描述】:

所以是时候问我第一个愚蠢的问题了。

有两个简单相同的测试:

    def test_home_page_status_code(self):
        response = self.client.get('/en/')
        self.assertEquals(response.status_code, 200)

    def test_view_url_by_name(self):
        response = self.client.get(reverse('web:home'))
        self.assertEquals(response.status_code, 200)

有两个简单的 url 配置:

...
urlpatterns = i18n_patterns(
    path('', include('web.urls', namespace='web')),
    )
...

...

app_name = 'web'

urlpatterns = [
    path('', views.HomePageView.as_view(), name='home'),
    ]
...

而且模板中有一段代码:

{% for lang_code, lang_name in languages %}
 {% language lang_code %}
  <a class="dropdown-item" href="{% url request.resolver_match.view_name %}">{{ lang_name }}</a>
 {% endlanguage %}
{% endfor %}

如果我评论模板中的代码,两个测试都会通过;如果我留下代码,反向测试就会失败。

  raise NoReverseMatch(msg)
django.urls.exceptions.NoReverseMatch: Reverse for '' not found. '' is not a valid view function or pattern name.

我做错了什么?或者我必须反向传递什么参数才能通过测试?

【问题讨论】:

  • 这是您传递的网址。 {% url request.resolver_match.view_name %} 这不是给定上下文的有效 url。用你需要的合适的来改变它。
  • @DenizKaplan 如果运行 selenium 测试,此模板显示正确且链接正确。
  • 你的 urlconf 的命名空间是什么?
  • @Harben url_resolver.namespace_dict.keys() dict_keys(['debug_toolbar', 'social', 'ranking', 'partners', 'card', 'profiles', 'cocktails', 'blog ', '网络', '管理员'])
  • @Harben 还是我误解了这个问题?

标签: django django-templates django-testing django-i18n


【解决方案1】:

reverse('web:home') 在你的应用中使用 URLConf 的命名空间和模式中的 url 名称,以便知道去哪里。

除非您的主页 url 模式使用 'web' 命名空间

app_name = 'web' # Namespace
urlpatterns = [
    path('', views.HomePageView.as_view(), name='home'),
    ]

反向会找不到web:home在哪里

def test_view_url_by_name(self):
        response = self.client.get(reverse('web:home'))
        self.assertEquals(response.status_code, 200)

【讨论】:

  • 第二个文件 urls.py 中存在命名空间,我认为这里还有其他内容:如果您从模板中删除代码,两个测试都会通过。问题似乎是当测试加载模板时它无法执行 request.resolver_match.view_name
  • 你有两个命名空间 web 所以我认为它们可能会发生冲突
猜你喜欢
  • 2015-03-13
  • 2018-09-23
  • 1970-01-01
  • 2012-10-24
  • 2012-10-23
  • 2011-05-18
  • 2018-08-27
  • 2020-11-26
  • 1970-01-01
相关资源
最近更新 更多