使用python unittest框架测试函数内部的函数调用

时间:2014-02-20 11:50:34

标签: python unit-testing mockito 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()。

有没有办法测试这种情况? 我是测试世界和框架的新手。

2 个答案:

答案 0 :(得分:1)

在你的例子中,你正在测试你的模拟。

  • 您创建了ISightRequestingEngine
  • 的模拟
  • 您调用该模拟的startEngine()方法
  • 您验证是否已调用模拟对象

您想要做的是:

  • 模拟testFunc()
  • 致电startEngine()
  • 验证是否已调用testFunc()

我对mockito不熟悉,但是我可以从the documentation得到什么,我想你必须做以下事情:

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

答案 1 :(得分:0)

有类似的问题,我在编写测试用例时有点迷失

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)

如果您看到我已经通过testable函数container = self.adapter.get_user_company_rate_limit()模拟了get_user_company_rate_limit()调用  但我仍然无法弄清楚我可以模仿这个电话的方式,

 self.adapter = UserAdapter(user_public_key)