Я пытаюсь использовать pytest-приспособления, чтобы высмеять вызовы на open()
, а затем сбросить его на тестовом отрыве, но по какой-то причине макет не применяется в тестовой функции.Mocking не работает с pytest и flexmock
Вот пример того, что у меня есть:
# tests.py
@pytest.fixture(scope='module')
def mock_open(request):
mock = flexmock(sys.modules['__builtin__'])
mock.should_call('open')
m = (mock.should_receive('open')
.with_args('/tmp/somefile')
.and_return(read=lambda: 'file contents'))
request.addfinalizer(lambda: m.reset())
def test_something(mock_open):
ret = function_to_test()
ret[1]() # This actually uses the original open()
И, в случае, если это важно, вот что function_to_test()
выглядит следующим образом:
# some_module.py
def function_to_test():
def inner_func():
open('/tmp/somefile').read() # <-- I want this call mocked
# More code ...
return (True, inner_func)
Это также происходит, если я использую XUnit стиле setup_module()
/teardown_module()
функции. Но если я вставляю издевательский код внутри самой тестовой функции (чего я, очевидно, не хочу делать), то она отлично работает.
Что мне не хватает? Благодаря!
могли бы вы предоставить полный автономный пример и включают в себя версии библиотек, которые вы используете? Я не использовал flexmock, но ваш прибор выглядит хорошо на первой стороне. Когда я попытался запустить его, я получил '' and_return() получил неожиданный аргумент ключевого слова 'read'''. – hpk42