Не могу импортировать пакеты django с носоглотками - PullRequest
2 голосов
/ 16 сентября 2011

Я пытаюсь начать использовать носовые морщины, но я сталкиваюсь с проблемой, которую я не могу заставить пройти даже самые простые случаи при использовании django.

при работе без флага --without-sandbox оба следующих теста не пройдены

def test_import_django  ():
    import django

def test_import_django_http  ():
    import django.http

Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\nose-1.1.2-py2.7.egg\nose\case.py", line 1
97, in runTest
    self.test(*self.arg)
  File "C:\Users\User\Desktop\TDD_GAE\myproj\tests.py", line 2, in test_import_d
jango
    import django
  File "C:\Python27\lib\site-packages\nosegae-0.1.9-py2.7.egg\nosegae.py", line
207, in find_module
    return super(HookMixin, self).find_module(fullname, path)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\de
v_appserver.py", line 1505, in Decorate
    return func(self, *args, **kwargs)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\de
v_appserver.py", line 1998, in find_module
    search_path)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\de
v_appserver.py", line 1505, in Decorate
    return func(self, *args, **kwargs)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\de
v_appserver.py", line 2119, in FindModuleRestricted
    result = self.FindPathHook(submodule, submodule_fullname, path_entry)
  File "C:\Program Files (x86)\Google\google_appengine\google\appengine\tools\de
v_appserver.py", line 2219, in FindPathHook
    return self._imp.find_module(submodule, [path_entry])

Однако, если я использую --without-sandbox хотя бы первый тест пройден

myproj.tests.test_import_django ... ok
myproj.tests.test_import_django_http ... ERROR

======================================================================
ERROR: myproj.tests.test_import_django_http
----------------------------------------------------------------------
Traceback (most recent call last):
  File "C:\Python27\lib\site-packages\nose-1.1.2-py2.7.egg\nose\case.py", line 1
97, in runTest
    self.test(*self.arg)
  File "C:\Users\User\Desktop\TDD_GAE\myproj\tests.py", line 5, in test_import_d
jango_http
    import django.http
  File "C:\Program Files (x86)\Google\google_appengine\lib\django_1_2\django\htt
p\__init__.py", line 9, in <module>
    from mod_python.util import parse_qsl
  File "C:\Python27\lib\site-packages\nosegae-0.1.9-py2.7.egg\nosegae.py", line
199, in find_module
    mod_path = self.find_mod_path(fullname)
  File "C:\Python27\lib\site-packages\nosegae-0.1.9-py2.7.egg\nosegae.py", line
251, in find_mod_path
    _sf, path, _desc= self._imp.find_module(top, None)
AttributeError: 'str' object has no attribute 'find_module'

Кто-нибудь сталкивался и знает, как я могу пройти мимо этого?

Редактировать

Кажется, проблема в рекурсивном импорте

def test_import_pdb ():
    import pdb
    pdb.set_trace ()

часть трассировки стека -

File "C:\Python27\lib\pdb.py", line 72, in __init__
  import readline

обратите внимание, что import in __init__ из django.http также является частью трассировки стека

1 Ответ

1 голос
/ 16 сентября 2011

Прочитайте https://docs.djangoproject.com/en/dev/topics/testing/ о тестировании Django.

Как я знаю, лучше использовать unittest или doctest, поставляемые с django, так как они имеют несколько улучшений для тестирования, специфичного для django, например, тестирование выходных данных поля формы и некоторыеособенности базы данных.Однако это не важно, и если вы хотите продолжить использовать нос - подумайте, что вы пропустили настройку среды django:

from django.test.utils import setup_test_environment
setup_test_environment()

Эти строки необходимы для запуска ваших тестов за пределами ./manage.py --test

UPD Да, мои предыдущие мысли были неверными.Так что я просто копался в источниках носа и носа, и что я думаю - проверьте определение HardenedModulesHook в вашей версии носа, причина в стволе носа, я нашел следующее:

class HardenedModulesHook(object):
    ...
    def __init__(self,
               module_dict,
               imp_module=imp,
               os_module=os,
               dummy_thread_module=dummy_thread,
               pickle_module=pickle):
    ...

Это дает следующее -когда выполняется плагин noseGAE begin() -> там вызывается self._install_hook(dev_appserver.HardenedModulesHook), который объявляет класс смешанного хука и создает его экземпляр как self.hook = Hook(sys.modules, self._path).<- <code>HardenedModulesHook.__init__ вызывается со вторым аргументом как мистический '_path', однако в NOSE этот аргумент должен быть модулем 'imp' по умолчанию -> Это делает исключение, которое вы получили:

    _sf, path, _desc= self._imp.find_module(top, None)
AttributeError: 'str' object has no attribute 'find_module'  

ТакЯ думаю, что это может быть проблема с носа: (

...