python - 无法使用 __exit__ 方法创建mockito模拟

标签 python unit-testing mockito attributeerror contextmanager

我无法在测试中将 __exit__ 方法附加到 mockito 模拟,以便模拟在 with 语句中使用它时不会介意。

这是一个不断引发 AttributeError: __exit__:

的测试示例
# main.py
class FooManager(object):
    def __enter__(self):
        print "Connect"
    def __exit__(self, exc_type, exc_val, exc_tb):
        print "Dissconnect"
    def foo(self):
        print "Foo"    

def function_to_be_tested(manager):
    # type: (FooManager) -> None
    with manager:
        manager.foo()
# test.py
from mockito import mock, verify, when, any as ANY

def test():
    manager_mock = mock()

    # none of this has any effect:
    manager_mock.__exit__ = lambda a, b, c: None
    when(manager_mock).__exit__(ANY(), ANY(), ANY()).thenReturn(None)

    function_to_be_tested(manager_mock)
    verify(manager_mock, times=1).foo()

解决我的问题的唯一解决方案是:

class ContextManagerMock(mock):
    def __enter__(self):
        return None
    def __exit__(self, exc_type, exc_val, exc_tb):
        return None

def test():
    manager_mock = ContextManagerMock()
    function_to_be_tested(manager_mock)
    verify(manager_mock, times=1).foo()

但是,我想知道,当我尝试通过 when 函数附加 __exit__ 方法时,为什么会出现 AttributeError 或使用 lambda 函数。

最佳答案

您可能只是错过了您还需要模拟 __enter__

In [24]: m = mock()

In [25]: when(m).__enter__(...)
Out[25]: <mockito.invocation.AnswerSelector at 0x13db478>

In [26]: when(m).__exit__(...)
Out[26]: <mockito.invocation.AnswerSelector at 0x501bd00>

In [27]: with m: ...

In [28]: verify(m).__enter__()

In [29]:

如果我不模拟__enter__,我会得到一个AttributeError: __enter__

关于python - 无法使用 __exit__ 方法创建mockito模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54676909/

相关文章:

python - 如何使用 Python 3 循环导入

python - 将特定功能应用于 Spark 数据框中的结构化列的有效方法?

java - 使用 PIT 查找无用的单元测试

java - 如何使用 Powermock 模拟常规方法

java - 从使用Mockito模拟的restTemplate.exchange()中检索httpEntity对象

python - 每 n 行重复随机数

python - 线与多边形交点坐标

python - 制作一个永远不会并行运行的 Python 单元测试

java - Mockito 通过泛型类型的构造函数参数反射创建模拟

java - 如何在反射的私有(private)方法上模拟自动连线的私有(private)响应