我正在尝试使用 pytest 固定装置来模拟调用open()
,然后在测试拆解时将其重置,但由于某种原因,模拟未应用于测试功能。
这是我所拥有的示例:
# 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()
函数,也会发生这种情况。但是,如果我将模拟代码放在测试函数本身中(我显然不想这样做),那么它就可以正常工作。
我错过了什么?谢谢!