我很难受pytest,相对导入和补丁的配合。
我有以下内容:
from .. import cleanup
class CleanupTest(unittest.TestCase):
@patch.object(cleanup, 'get_s3_url_components', MagicMock())
@patch.object(cleanup, 'get_db_session', MagicMock(return_value={'bucket', 'key'}))
@patch('time.time')
def test_cleanup(self, mock_time, mock_session, mock_components):
...
我尝试了一些变化。
答案 0 :(得分:1)
这实际上与pytest
没有任何关系,而仅仅是mock
装饰器的行为
来自the docs
如果将patch()用作修饰符,而省略了
new
,则将创建的模拟作为附加参数传递给修饰的函数
也就是说,因为您要传递替换对象,所以不会发生签名突变
例如:
from unittest import mock
class x:
def y(self):
return 'q'
@mock.patch.object(x, 'y', mock.Mock(return_value='z'))
def t(x): ...
t() # TypeError: t() missing 1 required positional argument: 'x'
幸运的是,如果要生成mock
对象,则几乎不需要实际传递new
参数,并且可以使用关键字选项
对于您的特定示例,这应该可以正常工作:
@patch.object(cleanup, 'get_s3_url_components')
@patch.object(cleanup, 'get_db_session', return_value={'bucket', 'key'})
@patch('time.time')
def test_cleanup(self, mock_time, mock_session, mock_components): ...
如果您绝对需要将它们设为MagicMock
,则可以使用new_callable=MagicMock
关键字参数