ludibrio icon indicating copy to clipboard operation
ludibrio copied to clipboard

Bug when trying to Stub os.path.exists

Open sk- opened this issue 13 years ago • 2 comments

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- avatar Feb 09 '12 04:02 sk-

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)

sk- avatar Feb 11 '12 05:02 sk-

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

wyuenho avatar Apr 03 '12 05:04 wyuenho