imi*_*ric 4 python unit-testing pytest flexmock
我正在尝试使用pytest fixture来模拟调用open(),然后在测试拆卸时重置它,但由于某种原因,mock不会应用于测试函数中.
这是我的样本:
# 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()
Run Code Online (Sandbox Code Playgroud)
而且,如果它很重要,这就是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)
Run Code Online (Sandbox Code Playgroud)
如果我使用xUnit-style setup_module()/ teardown_module()functions 也会发生这种情况.但是如果我把模拟代码放在测试函数本身(我显然不想这样做),那么它工作正常.
我错过了什么?谢谢!
fal*_*tru 13
怎么用mock?
tests.py:
import mock # import unittest.mock (Python 3.3+)
import pytest
from some_module import function_to_test
@pytest.fixture(scope='function')
def mock_open(request):
m = mock.patch('__builtin__.open', mock.mock_open(read_data='file content'))
m.start()
request.addfinalizer(m.stop)
def test_something(mock_open):
ret = function_to_test()
assert ret[1]() == 'file content'
Run Code Online (Sandbox Code Playgroud)
some_module.py:
def function_to_test():
def inner_func():
return open('/tmp/somefile').read()
return True, inner_func
Run Code Online (Sandbox Code Playgroud)