我有一段代码需要通过pytest进行测试
def my_function(value):
with some_generator() as gen:
gen.some_method(value)
我需要检查some_method是否已被调用。我已经使用pytest-mock
来模拟some_generator方法来返回MagicMock
并使用该对象来检查该方法是否被调用。但它返回的是假的。同样,我分配的返回值不会反映到some_method
def test_myfunction(mocker):
generator = mocker.patch('some_generator')
mocked_obj = mock.MagicMock()
generator.return_value = mocked_obj
my_function(1)
assert mocked_obj.some_method.called
即使调用gen.some_method(value)
,测试也总是失败。
答案 0 :(得分:1)
我认为您有两个问题:
mocker
some_generator
在哪里。我认为您需要包含一个模块名称。__enter__()
调用。为此,您不需要单独的模拟对象,mocker
已经为return_value
和任何嵌套属性创建了一个模拟对象。这是测试的固定版本:
from scratch import my_function
def test_myfunction(mocker):
generator = mocker.patch('scratch.some_generator')
my_function(1)
assert generator.return_value.__enter__.return_value.some_method.called
为了完整起见,这是我使用的my_function
的可运行版本:
# scratch.py
def some_generator():
pass
def my_function(value):
with some_generator() as gen:
gen.some_method(value)