我试图了解如何使用pytests测试Context managert。
我创建了一些类,需要计算静态方法do_dome_stuff
class Iterator():
def __init__(self):
pass
@staticmethod
def do_some_stuff():
pass
def __enter__(self):
return [i for i in range(10)]
def __exit__(self, *args):
return True
iterator = Iterator()
def f(iterator):
with iterator as i:
for _ in i:
iterator.do_some_stuff()
我创建了py.test文件,需要检查函数是否被调用了10次。但我的解决方案无效:
@pytest.fixture
def iterator():
return MagicMock(spec=Iterator)
def test_f(iterator):
f(iterator)
assert (iterator.do_some_stuff.call_count == 10)
提前致谢
答案 0 :(得分:1)
您的代码无效的原因是,MagicMock(spec=Iterator)
替换了__enter__
类Iterator
类的MagicMock
方法,请参阅{{ 3}}。这意味着在您的测试中,函数i
中f
的值是MagicMock
对象而不是list(range(10))
,因此for循环中的代码永远不会执行。< / p>
为了使其有效,您可能只想模拟do_some_stuff
方法:
@pytest.fixture
def iterator():
it = Iterator()
it.do_some_stuff = Mock()
return it
def test_f(iterator):
f(iterator)
assert (iterator.do_some_stuff.call_count == 10)