Проверьте, есть ли у dict запись при вызове mock

#python #python-3.x #python-unittest #python-unittest.mock

#python #python-3.x #python-unittest #python-unittest.mock

Вопрос:

Один из моих классов должен сделать что-то вроде этого:

 class A:
    def __init__(self, someDict, someOtherObject):
        self._someDict = someDict
        self._someOtherObject = someOtherObject

    def func(self):
       self._someDict["key"] = None
       self._someOtherObject.foo()
  

Теперь я хотел бы проверить, "key" существует ли внутри переданного словаря на данный момент, был вызван foo .

 class Test( unittest.TestCase ):
    def test_funcShouldAddKeyToDictionaryBeforeCallingFoo(self):
        objectMock = Mock()
        someDict = {}
        aUnderTest = A(someDict, objectMock)

        aUnderTest.func()

        # assert "key" in someDict when called objectMock.foo()
  

Как я могу проверить, есть ли в словаре уже запись до вызова foo?

Комментарии:

1. Откуда берется _someObject свойство?

2. @slideshowp2 Спасибо, что указали на это. Это была ошибка. Должно быть _someOtherObject

3. assert "key" in a._someDict ?

4. @MrBeanBremen Но что, если «ключ» был добавлен в словарь после вызова foo. Тест пройдет, хотя я не хочу, чтобы он проходил. Моя цель — распознать, была ли добавлена словарная запись до того, как я вызвал foo() , а не только если она была добавлена.

5. Ах, извините — очевидно, я неправильно прочитал ваш вопрос. Теперь понял…

Ответ №1:

Вы можете foo заменить свою собственную функцию, которая выполняет проверку:

 class Test(unittest.TestCase):
    def test_funcShouldAddKeyToDictionaryBeforeCallingFoo(self):
        def check_dict():
            self.assertIn("key", someDict)

        objectMock = Mock()
        someDict = {}
        aUnderTest = A(someDict, objectMock)
        objectMock.foo = check_dict  # "check_dict" will be called instead of "foo"
        aUnderTest.func()
  

Таким образом, ваша проверка, выполняемая в данный момент foo , была бы вызвана в тестируемом коде по мере необходимости.