Тестирование вызова функции внутри функции с использованием фреймворка python unittest

Я хочу протестировать этот класс, используя фреймворк python unittest, а также mockito.

class ISightRequestEngine(object):
    def __init__(self, pInputString=None):
        self.__params = (pInputString)

    def openHTTPConnection(self):
        pass

    def __closeHTTPConnection(self):
        pass

    def testFunc(self):
        print 'test function called'

    def startEngine(self):
        self.__params.parseinputString()
        self.openHTTPConnection()
        self.testFunc()

    def processRequest(self, header = None):
        pass

Я хотел проверить, что функция startEngine() вызывает testFunc().

Подобно тому, что мы делаем в нашем издевательском классе,

obj = mock(ISightRequestEngine)
obj.startEngine()

try:
    verify(obj).startEngine()
except VerificationError:

К сожалению, это только проверяет, вызвана ли функция startEngine или нет, но не дает фактического вызова функции, и я не могу проверить, был ли вызов testFunc() или нет.

Есть ли способ проверить этот сценарий? Я новичок в тестировании мира и фреймворка.


person Bhupesh Pant    schedule 20.02.2014    source источник


Ответы (2)


В вашем примере вы тестируете свой макет.

  • Вы создаете макет ISightRequestingEngine
  • Вы вызываете метод startEngine() этого макета
  • Вы проверяете, что фиктивный объект был вызван

Что вы хотите сделать, это:

  • Насмешка testFunc()
  • Звоните startEngine()
  • Убедитесь, что testFunc() был вызван

Я не знаком с mockito, но что из того, что я могу сделать из документации, я думаю, вам нужно сделать что-то вроде следующего:

from mockito import mock, verify

# Setup ---------------------------------------------   
my_mock = mock(ISightRequestingEngine)

system_under_test = ISightRequestingEngine()

system_under_test.testFunc = my_mock.testfunc # Mock out only testFunc()

# Exercise ------------------------------------------
system_under_test.startEngine()

# Verify --------------------------------------------
verify(my_mock).testFunc()
person spoorcc    schedule 20.02.2014
comment
это должно полностью решить мою проблему. Я проверю это и сообщу вам, сработало ли это для меня или нет. - person Bhupesh Pant; 20.02.2014
comment
НЕ РАБОТАЕТ. Я получаю сообщение об ошибке: Ошибка типа: «фиктивный» объект не может быть вызван. - person Bhupesh Pant; 20.02.2014
comment
Сделал очень небольшое изменение кода в вашем коде, и это сработало для меня. - person Bhupesh Pant; 20.02.2014
comment
Не могли бы вы отредактировать мой ответ, чтобы помочь людям в будущем? - person spoorcc; 20.02.2014
comment
Я уже сделал это вчера, вам нужно принять изменения. Кроме того, я пропустил, чтобы поблагодарить вас. Большое спасибо @user1149326 - person Bhupesh Pant; 21.02.2014

У меня похожая проблема, когда я немного теряюсь при написании тестового примера.

class UserCompanyRateLimitValidation:
    def __init__(self, user_public_key):
        self.adapter = UserAdapter(user_public_key)
        container = self.adapter.get_user_company_rate_limit()
        super(UserCompanyRateLimitValidation, self).__init__(container,\
                                            UserCompanyRateLimitValidation.TYPE)

Я должен проверить эту функцию. Я написал тестовый пример примерно так. Я пытался издеваться над классом UserAdapter, но не могу сделать это полностью.

def test_case_1():
   self.user_public_key = 'TEST_USER_PUBLIC_KEY_XXXXXX1234567890XXXXX'
   UserAdapter_mock = mock(UserAdapter)
   when(UserAdapter_mock).get_user_company_rate_limit().\
                                          thenReturn(self.get_container_object())
   self.test_obj = UserCompanyRateLimitValidation(self.user_public_key)

Здесь, если вы видите, что я смоделировал вызов get_user_company_rate_limit() из тестируемой функции, container = self.adapter.get_user_company_rate_limit() но я все еще не могу понять, как я могу смоделировать этот вызов,

 self.adapter = UserAdapter(user_public_key)
person Bhupesh Pant    schedule 27.02.2014