2013-02-04 64 views
0

我的測試:Selenium測試,LiveServerTestCase,Django的,和NoReverseMatch

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'), 

) 
+0

「urls.py」中包含'user_profile_update'的相關行是什麼? –

+0

添加了完整的urls.py文件。 – ghiotion

+0

這個URL看起來很有意義。我已經用更多建議更新了我的答案。 –

回答

0

例外說,沒有user.id傳遞給reverse功能,它只是得到一個空字符串。

你可以看一下堆棧跟蹤來了解函數被調用的方式嗎? (我可能會呆滯,但在上面的代碼中我看不到reverse的調用)。您應該能夠看到空字符串來自哪裏,並將其替換爲您想要的user.id

另請嘗試查看您傳遞給模板的用戶對象(用於測試上述url函數的對象) - 將您的測試交換爲{{ user }}以確保您傳遞的是有效用戶。如果你傳遞的是一個有效的用戶名,那麼你的url.conf中可能有重複的內容(例如同一視圖和相同數量的參數)。如果是這種情況,那麼你可能需要使用named url patterns

UPDATE

是否有可能該頁面已加載之前在測試最後斷言語句正在運行?你可以在click()之後手動插入5秒等待嗎?你是否通過手動運行?登錄是否會直接進入帶有「更改密碼」文本的頁面?

+0

這是奇怪的事情。我不會在代碼中的任何地方調用反向。我打開一個firefox實例,進入一個頁面,輸入一個用戶名/密碼,點擊返回,然後點擊一個鏈接。測試_passes_。該頁面出現在Firefox中沒有錯誤。但是我得到了這個瘋狂的stacktrace,就像你看到你沒有向{%url user_profile_update%}傳遞任何東西一樣。真是莫名其妙。 – ghiotion

+0

'reverse'將被{%url%}'標籤調用,但正如Aidan所說,user.id似乎是模板中的空字符串。也許你可以在單獨的html元素中輸出'{{user.id}}'來檢查。 –