与上下文管理器

时间:2018-01-23 17:12:36

标签: python-3.x mocking pytest

我试图了解如何使用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) 

提前致谢

1 个答案:

答案 0 :(得分:1)

您的代码无效的原因是,MagicMock(spec=Iterator)替换了__enter__Iterator类的MagicMock方法,请参阅{{ 3}}。这意味着在您的测试中,函数if的值是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)