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

Python 2.7 从上下文管理器创建的对象模拟函数,python-2.7,mocking,python-mock,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 unit

我正试图为以下模块编写单元测试

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"))
测试失败,因为结果[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')
请注意,其中每一个都是一个单独的
MagicMock
实例,您可以对其进行配置:

  • mockCtxMgr
  • mockCtxMgr()
  • mockCtxMgr()
  • mockCtxMgr()
  • mockCtxMgr()。\uuuu输入\uuuu().someFunc
magicmock是惰性创建的,但具有标识,因此您可以通过这种方式配置它们,它就可以正常工作

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"))