Поддельные функции из объекта, созданного менеджером контекста - PullRequest
1 голос
/ 06 июня 2019

У меня есть следующий модуль, для которого я пытаюсь написать модульные тесты.

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 (). Кто-нибудь знает, как мне это сделать?

Спасибо!

1 Ответ

1 голос
/ 06 июня 2019

Ошибка говорит:

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 .

. Это работает для меня:

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 создаются лениво, но имеют идентичность, поэтому вы можете настроить их таким образом, и это просто работает.

...