【问题标题】:Selenium tests, LiveServerTestCase, Django, and NoReverseMatchSelenium 测试、LiveServerTestCase、Django 和 NoReverseMatch
【发布时间】:2013-01-19 18:03:54
【问题描述】:

我的测试:

class BasicProfileTest(LiveServerTestCase):
fixtures = ['admin_user.json', 'gym.json', 'user_profile.json']

def setUp(self):
    self.browser = webdriver.Firefox()
    self.browser.implicitly_wait(3)

def tearDown(self):
    self.browser.quit()

def test_can_login_check_profile(self):
    self.browser.get(self.live_server_url + '/trackstats/index/')

    body = self.browser.find_element_by_tag_name('body')
    self.assertIn('Track your workouts. See your progress. Share with friends.', body.text)

    username_field = self.browser.find_element_by_name('username')
    username_field.send_keys('bobo')

    password_field = self.browser.find_element_by_name('password')
    password_field.send_keys('.....')
    password_field.send_keys(Keys.RETURN)

    profile_link = self.browser.find_element_by_link_text("bobo's profile")
    profile_link.click()

    body = self.browser.find_element_by_tag_name('body')
    self.assertIn('Change Password', body.text)

当我运行测试时,它通过了,但它也抛出了一个

NoReverseMatch: Reverse for 'user_profile_update' with arguments '('',)' and keyword arguments '{}' not found.

如果我在 base.html 中放置指向用户个人资料的直接链接:

/trackstats/profile/update/{{user.id}}

我没有收到反向匹配异常。但是一旦我用

替换它
{% url user_profile_update user.id %}

它会出现 NoReverMatch 异常。

我觉得我在这里遗漏了一些明显的东西。

更新1.添加urls.py

from django.conf.urls import patterns, include, url
from django.conf import settings
from django.contrib import admin
admin.autodiscover()
from django.views.generic.simple import redirect_to

urlpatterns = patterns('',
    (r'^$', redirect_to, {'url': '/trackstats/index/'}),
    url(r'^admin/', include(admin.site.urls)),
    (r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'registration/login.html'}),
    (r'^accounts/', include('registration.backends.default.urls')), 
    url(r'^trackstats/index/', 'trackstats.views.index', name='index'),
    url(r'^trackstats/user_profile/create/', 'trackstats.views.user_profile_create', name='user_profile_create'),
    url(r'^trackstats/user_profile/update/(?P<object_id>\d{1,5})/', 'trackstats.views.user_profile_update', name='user_profile_update'),
    url(r'^trackstats/gym/create/', 'trackstats.views.gym_create', name='gym_create'),
    url(r'^trackstats/gym/update/(?P<object_id>\d{1,5})/', 'trackstats.views.gym_update', name='gym_update'),
    url(r'^trackstats/workout/create/', 'trackstats.views.workout_create', name='workout_create'),
    url(r'^trackstats/workout/update/(?P<object_id>\d{1,5})/', 'trackstats.views.workout_update', name='workout_update'),
    url(r'^trackstats/workout/assign/', 'trackstats.views.workout_assign', name='workout_assign'),

)

【问题讨论】:

  • urls.py 中包含 'user_profile_update' 的关联行是什么?
  • 添加了完整的 urls.py 文件。
  • URL 看起来都有意义。我已经用更多建议更新了我的答案。

标签: django testing selenium


【解决方案1】:

异常表示没有 user.id 被传递给 reverse 函数,它只是得到一个空字符串。

您能否查看堆栈跟踪以了解该函数是如何被调用的? (我可能很迟钝,但我在上面的代码中看不到对reverse 的调用)。您应该能够看到空字符串的来源,并将其替换为您想要的 user.id

还可以尝试查看您传递给模板的用户对象(您用来测试上述url 函数的对象)- 将您的测试换成{{ user }},以确保您通过了一个有效用户。如果您传递的是具有有效 id 的有效用户,那么您的 url.conf 中可能存在重复项(例如,相同的视图和相同数量的参数)。如果是这种情况,那么您可能需要使用named url patterns

更新

您的测试中的最终断言语句是否可能在页面加载之前运行?您可以在click() 之后手动插入 5 秒等待吗?你有没有手动运行过这个?登录后会直接进入带有“更改密码”字样的页面吗?

【讨论】:

  • 这很奇怪。我在代码中的任何地方调用 reverse。我正在打开一个 Firefox 实例,进入一个页面,输入用户/密码,点击返回,然后单击一个链接。测试通过。该页面出现在 Firefox 中,没有错误。但是我得到了这个疯狂的堆栈跟踪,就像你会看到你是否没有传递任何东西给 {% url user_profile_update %}。真是莫名其妙。
  • reverse 将被 {% url %} 标签调用,但正如 Aidan 所说,user.id 在您的模板中似乎是一个空字符串。也许您可以在单独的 html 元素中输出{{ user.id }} 以进行检查。
猜你喜欢
  • 2015-12-26
  • 2019-12-02
  • 2016-01-16
  • 2014-07-16
  • 2017-10-16
  • 1970-01-01
  • 2014-07-13
  • 2016-08-05
  • 1970-01-01
相关资源
最近更新 更多