Фалшивият клас не се инжектира при изпълнение на всички django-nose тестове заедно

Сблъсквам се със странен проблем, който изглежда идва от начина, по който модулните тестове на python управляват своя импорт и как това е свързано с макетния пакет. Това е за django проект, използващ django-nose/nose за изпълнение на тест на единица и mock за подигравка.

Имам единичен тест, използващ макет, който работи перфектно, когато се изпълнява сам (python manage.py test tests/test_code.py)

вътре в test_code.py:

from my.app.models.bookstore import create_from_proxy

class MockTestCase( TestCase ):

    def setUp( self ):
        self.patcher = patch( 'my.app.models.bookstore.BookProxy', autospec=True )
        self.mock_proxy = self.patcher.start()
        self.proxy_instance = self.mock_proxy.return_value
        self.proxy_instance.json = json.loads(BOOK_JSON)

    def tearDown( self ):
        self.patcher.stop()

    def test_mock_works( self ):
        book_id = 55
        v = create_from_proxy( book_id )
        self.assertTrue( self.mock_proxy.called )
        ... more tests ...

вътре в bookstore.py:

from my.app.proxies import BookProxy

def create_from_proxy( self, id ):
    proxy = BookProxy(id)
    ...

Въпреки това, когато стартирам този тест като част от целия набор от тестове (тест за python manage.py), тогава тестът се проваля, защото кодът bookstore.py не получава инжектирания макетен клас и се връща към действителния код за BookProxy.

Така че изглежда има нещо, което се случва, когато всички тестове се изпълняват заедно, но не мога да разбера каква е причината за неуспеха на фалшивото инжектиране. Изглежда, че всички други модулни тестове, които използват макет, почистват след себе си (или използвайки декоратора, контекста или изричния подход на обекта на корекцията, който показвам тук).

Виждали ли сте някога нещо подобно там?


person Jon Sorenson    schedule 15.07.2014    source източник
comment
Вашият тест коригира my.app.models.bookstore.BookProxy, но кодът ви използва from my.app.proxies import BookProxy. Така че е вероятно да коригирате обекти, които се оказват еднакви, когато изпълнявате тестовете ръчно, но не и когато го изпълнявате с manage.py.   -  person Simeon Visser    schedule 16.07.2014
comment
Все още не съм сигурен, че знам какво да направя по различен начин. Всички тестове се изпълняват, започвайки от manage.py (имам извикванията на командния ред в първоначалния си въпрос). Усещането е, че зареждането на пакета е различно в django-nose (или е прав нос?) за много тестове спрямо един в изолация, но не мога да архивирам твърдението си тук.   -  person Jon Sorenson    schedule 18.07.2014
comment
Имах подобен проблем и този отговор ми помогна: stackoverflow.com/a/32506691/6193591   -  person Marosinho    schedule 19.10.2016