Как вы макетируете патч для класса Python и получаете новый объект Mock для каждого экземпляра?

OK,
Я знаю, что это упоминается в руководстве и, вероятно, связано с side_effect и /или return_value, но простой, прямой пример поможет мне безмерно.

У меня есть:

class ClassToPatch():
   def __init__(self, *args):
       _do_some_init_stuff()

   def some_func():
       _do_stuff()


class UUT():
    def __init__(self, *args)
       resource_1 = ClassToPatch()
       resource_2 = ClassToPatch()

Теперь я хочу провести модульное тестирование класса UUT и высмеивать ClassToPatch. Знание класса UUT приведет к созданию именно двух ClassToPatch объекты, я хочу, чтобы инфраструктура Mock возвращала новый объект Mock для каждого экземпляра, чтобы впоследствии я мог утверждать вызовы для каждого из них отдельно.

Как мне добиться этого, используя декоратор @patch в тестовом примере? А именно, как исправить следующий пример кода?

class TestCase1(unittest.TestCase):

    @patch('classToPatch.ClassToPatch',autospec=True)
    def test_1(self,mock1,mock2):
        _assert_stuff()
25 голосов | спросил bavaza 25 Maypm12 2012, 12:24:10

1 ответ


0

Вот быстрый и грязный пример, чтобы начать работу:

import mock
import unittest

class ClassToPatch():
   def __init__(self, *args):
       pass

   def some_func(self):
       return id(self)

class UUT():
    def __init__(self, *args):
        resource_1 = ClassToPatch()
        resource_2 = ClassToPatch()
        self.test_property = (resource_1.some_func(), resource_2.some_func())

class TestCase1(unittest.TestCase):
    @mock.patch('__main__.ClassToPatch', autospec = True)
    def test_1(self, mock1):
        ctpMocks = [mock.Mock(), mock.Mock()]
        ctpMocks[0].some_func.return_value = "funky"
        ctpMocks[1].some_func.return_value = "monkey"
        mock1.side_effect = ctpMocks

        u = UUT()
        self.assertEqual(u.test_property, ("funky", "monkey"))

if __name__ == '__main__':
    unittest.main()

Я добавил test_property к проверяемому оборудованию, чтобы модульный тест сделал что-то полезное. Теперь без макета test_property должен быть кортеж, содержащий идентификаторы двух ClassToPatch экземпляры. Но с макетом это должен быть кортеж: ("funky", "monkey").

Я использовал side_effect свойства фиктивного объекта, так что другой экземпляр ClassToPatch возвращается при каждом вызове в инициализаторе UUT.

Надеюсь, это поможет.

Изменить. Да, кстати, когда я запускаю модульный тест, я получаю:

.
----------------------------------------------------------------------
Ran 1 test in 0.004s

OK
ответил srgerg 25 Maypm12 2012, 13:25:52

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132