nsigustavo / ludibrio

Platform for test doubles in Python (mocks, stubs, Spy, and dummies)
113 stars 15 forks source link

Bug when trying to Stub os.path.exists #7

Open sk- opened 12 years ago

sk- commented 12 years ago

Please see the test below. The first test fails with an infinite recursion and the second works just great.

import os
from unittest import TestCase

from ludibrio import Stub, any

class TestStubReplacesStdlib(TestCase):
    def test_os_path_exist_bug(self):
        with Stub() as exists:
            from os.path import exists
            exists(any()) >> True
        self.assertTrue(os.path.exists('/path/to/inexistent/file'))
        exists.restore_import()

    def test_stub_replacement_success(self):
        with Stub() as getsize:
            from os.path import getsize
            getsize(any()) >> 1
        self.assertEquals(os.path.getsize('/path/to/inexistent/file'), 1)
        getsize.restore_import()
sk- commented 12 years ago

I found the cause of this issue. The problem is that the method of Stub _property_called_name relies on getframeinfo of module inspect. This module relies also on function os.path.exists. So when the replace of exists is made affects all the flow.

My suggestion would be to not call _replace_all for modules like ludibrio or inspect (a more finer exception could be made). I would be happy to provide the patch, but I'd definitely need some guidance, because I tried some patches and somehow I lost the Stub for the exists method. (i.e, after the import the exists is no longer a Stub but a function)

wyuenho commented 12 years ago

I bumped into this issue too. Is there a fix?