python-2.7 - 从上下文管理器创建的对象中模拟函数

标签 python-2.7 mocking python-mock

我有以下模块,我正在尝试为其编写单元测试。

import myModuleWithCtxMgr

def myFunc(arg1):
    with myModuleWithCtxMgr.ctxMgr() as ctxMgr:
        result = ctxMgr.someFunc()

    if result:
        return True, result
    return False, None

我正在处理的单元测试如下所示。

import mock
import unittest
import myModule as myModule

class MyUnitTests(unittest.TestCase):

    @mock.patch("myModuleWithCtxMgr.ctxMgr")
    def testMyFunc(self, mockFunc):
        mockReturn = mock.MagicMock()
        mockReturn.someFunc = mock.Mock(return_value="val")
        mockFunc.return_value = mockReturn
        result = myModule.myFunc("arg")

        self.assertEqual(result, (True, "val"))

测试失败,因为 result[0] = magicMock() 而不是我配置的返回值(我认为)。

我尝试了几种不同的测试变体,但我似乎无法模拟 ctxMgr.someFunc() 的返回值。有谁知道我如何实现这一目标?

谢谢!

最佳答案

错误提示:

First differing element 1:
<MagicMock name='ctxMgr().__enter__().someFunc()' id='139943278730000'>
'val'

- (True, <MagicMock name='ctxMgr().__enter__().someFunc()' id='139943278730000'>)
+ (True, 'val')

错误包含模拟名称,它准确地显示了需要模拟的内容。请注意,__enter__ 对应于 Context Manager protocol .

这对我有用:

class MyUnitTests(unittest.TestCase):

    @mock.patch("myModuleWithCtxMgr.ctxMgr")
    def testMyFunc(self, mockCtxMgr):
        mockCtxMgr().__enter__().someFunc.return_value = "val"
        result = myModule.myFunc("arg")

        self.assertEqual(result, (True, "val"))

请注意,其中每一个都是您可以配置的单独 MagicMock 实例:

  • mockCtxMgr
  • mockCtxMgr()
  • mockCtxMgr().__enter__
  • mockCtxMgr().__enter__()
  • mockCtxMgr().__enter__().someFunc

MagicMocks 是惰性创建的,但具有身份,因此您可以通过这种方式配置它们,并且它可以正常工作。

关于python-2.7 - 从上下文管理器创建的对象中模拟函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56478773/

相关文章:

java - Mockito:如何部分使用 @InjectMocks-Annotation 进行 MockMvc 测试?

javascript - 我怎样才能 Jest 模拟一个图书馆?

python - 如何在 Python 测试期间替换方法?

python - 将系列列表连接成 uid

python - "Expected type ' Union[str, bytearray] ' got ' int ' instead"write 方法警告

python - 使用 python multiprocess.pool.map_async() 时无法 pickle <type 'thread.lock' >

unit-testing - 将 .eml 文件加载到 javax.mail.Messages

python - assert_has_calls 不会 stub 方法调用

python - 如何正确使用模拟 call_args 和 Python 的unittest.mock?

python-2.7 - csv.DictReader 是否将文件存储在内存中?