2015-08-24 1 views
2

Всякий раз, когда я пытаюсь построить строку на основе self.live_server_url, я получаю Python TypeError сообщения. Например, я пробовал следующие строковые конструкции (форма 1 & 2 ниже), но я испытываю то же самое TypeError. Моя искомая строка - это URL-адрес Live Server с добавленным "/lists". ПРИМЕЧАНИЕ: фактический тест позволяет создать сервер, и я могу вручную получить доступ к серверу, а более конкретно, я могу вручную получить доступ к точному URL-адресу, который я пытаюсь создать программно (например, 'http://localhost:8081/lists ').TypeError при конкатенации live_server_url django.test.LiveServerTestCase с другой строкой

TypeError s с этими строковыми конструкциями.

# FORM 1 
lists_live_server_url = '%s%s' % (self.live_server_url, '/lists') 

# FORM 2 
lists_live_server_url = '{0}{1}'.format(self.live_server_url, '/lists') 

self.browser.get(lists_live_server_url) 

Там нет ошибки питона с этой формой (ничего добавляется к строке), хотя мой тест не пройден (как я бы ожидать, так как он не имеет доступа /lists).

self.browser.get(self.live_server_url) 

Вот ошибка python, которую я получаю.

/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/bin/python3.4 /Applications/PyCharm.app/Contents/helpers/pycharm/django_test_manage.py test functional_tests.lists_tests.LiveNewVisitorTest.test_can_start_a_list_and_retrieve_it_later /Users/myusername/PycharmProjects/mysite_proj 
    Testing started at 11:55 AM ... 
    Creating test database for alias 'default'... 
    Traceback (most recent call last): 
     File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/wsgiref/handlers.py", line 137, in run 
     self.result = application(self.environ, self.start_response) 
     File "/usr/local/lib/python3.4/site-packages/django/test/testcases.py", line 1104, in __call__ 
     return super(FSFilesHandler, self).__call__(environ, start_response) 
     File "/usr/local/lib/python3.4/site-packages/django/core/handlers/wsgi.py", line 189, in __call__ 
     response = self.get_response(request) 
     File "/usr/local/lib/python3.4/site-packages/django/test/testcases.py", line 1087, in get_response 
     return self.serve(request) 
     File "/usr/local/lib/python3.4/site-packages/django/test/testcases.py", line 1099, in serve 
     return serve(request, final_rel_path, document_root=self.get_base_dir()) 
     File "/usr/local/lib/python3.4/site-packages/django/views/static.py", line 54, in serve 
     fullpath = os.path.join(document_root, newpath) 
     File "/usr/local/Cellar/python3/3.4.2_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/posixpath.py", line 82, in join 
     path += b 
    TypeError: unsupported operand type(s) for +=: 'NoneType' and 'str' 

Am Я неосознанно пытается изменить live_server_url, которая ведет к этим TypeError с? Как я мог программно построить строку из live_server_url + "/lists"?

Вот тест, который я пытаю ...

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from django.test import LiveServerTestCase 

class LiveNewVisitorTest(LiveServerTestCase): 
    def setUp(self): 
     self.browser = webdriver.Chrome() 
     self.browser.implicitly_wait(3) 

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

    def test_can_start_a_list_and_retrieve_it_later(self): 
     #self.browser.get('http://localhost:8000/lists') 
     #self.browser.get('http://www.google.com') 
     #lists_live_server_url = '%s%s' % (self.live_server_url, '/lists') 
     #lists_live_server_url = '{0}{1}'.format(self.live_server_url, '/lists') 
     lists_live_server_url = self.live_server_url 
     self.browser.get(lists_live_server_url) 

     self.assertIn('To-Do', self.browser.title) 
     header_text = self.browser.find_element_by_tag_name('h1').text 
     self.assertIn('To-Do', header_text) 
+2

Не могли бы вы опубликовать фактический тестовый листинг? Не весь тестовый модуль f course, но по крайней мере setUp, setUpClass (если существует) и метод тестирования, который терпит неудачу? – J0HN

+0

Странно, что я боролся с такой же ошибкой прошлой ночью, но когда я попытался воспроизвести воспроизводимый пример для публикации в StackOverflow, я не смог реплицировать этот TypeError. Вы выяснили причину? – aashanand

ответ

3

See this discussion on Reddit показывая ту же ошибку Traceback.

В принципе, это не проблема ни с чем в тестах Selenium, а с конфигурацией статического файла вашего проекта.

Из Вашего вопроса, я считаю, что ключевая строка в Traceback является:

File "/usr/local/lib/python3.4/site-packages/django/views/static.py", line 54, in serve 
    fullpath = os.path.join(document_root, newpath) 

Эта линия указывает на то, что неудачная os.path.join предпринимается попытка в django.views.static.

Установите STATIC_ROOT в файле проекта вашего проекта settings.py, и вы должны быть хорошими.

+0

Проверено! Хорошая находка. Спасибо. – cmbind55

+0

Самая странная часть заключалась в том, что я думал, как и вы, что-то не так в моей конкатенации 'self.live_server_url' и различных url-шаблонов ... – aashanand

1

Использование StaticLiveServerTestCase вместо этого может помочь

+5

Приветствую вас и приветствуем Stack Overflow! Хотя ваш ответ может быть правильным или полезным для будущих читателей этого вопроса, вы должны добавить несколько подробностей, чтобы сделать ваш ответ более ясным. – Rishav