, - .
, . .
, . .
( )
, open std python.
class UsesOpen(object):
def some_method(self, path):
with open(path) as f:
process(f)
def main():
uses_open = UsesOpen()
uses_open.some_method('/my/path')
open , - () test mocking-framework, Dunes. :
: ( )
-:
class UsesOpen(object):
def __init__(self, myopen):
self.__open = myopen
def some_method(self, path):
with self.__open(path) as f:
process(f)
def main():
uses_open = UsesOpen(open)
uses_open.some_method('/my/path')
open (Constructor Dependency Injection).
open :
EXAMPLE_CONTENT = """my file content
as an example
this can be anything"""
TEST_FILES = {
'/my/long/fake/path/to/a/file.conf': EXAMPLE_CONTENT
}
class MockFile(object):
def __init__(self, content):
self.__content = content
def read(self):
return self.__content
def __enter__(self):
return self
def __exit__(self, type, value, tb):
pass
class MockFileOpener(object):
def __init__(self, test_files):
self.__test_files = test_files
def open(self, path, *args, **kwargs):
return MockFile(self.__test_files[path])
class TestUsesOpen(object):
def test_some_method(self):
test_opener = MockFileOpener(TEST_FILES)
uses_open = UsesOpen(test_opener.open)
Pro/Con
Pro Dependency Injection
Con Dependency Injection