Python mockito - 模拟从可测试函数实例化的类

Bhu*_*ant 6 python unit-testing mocking mockito stubbing

在为UserCompanyRateLimitValidation类编写测试用例时,我有点迷茫。我发现很难模拟从这个类内部实例化的类。

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)
Run Code Online (Sandbox Code Playgroud)

我必须测试这门课。我写过这样的测试用例。我试图模拟 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(get_fake_container_object())

   self.test_obj = UserCompanyRateLimitValidation(self.user_public_key)
Run Code Online (Sandbox Code Playgroud)

在这里,如果您看到我从可测试函数container = self.adapter.get_user_company_rate_limit() 中模拟了get_user_company_rate_limit() 调用,但我仍然无法弄清楚我可以模拟此调用的方式,

 self.adapter = UserAdapter(user_public_key)
Run Code Online (Sandbox Code Playgroud)

Ste*_*fan 6

如果你知道诀窍,这很简单。

在 Python 中创建对象非常类似于对类对象的函数调用。UserCompanyRateLimitValidation正在“调用” UserAdapter(user_public_key)。您想将那个“调用”的返回值存根到 return UserAdapter_mock

您可以像在模块中存根函数一样存根它。您缺少的行是:

when(module_declaring_UserAdapter)\
    .UserAdapter(self.user_public_key)\
    .thenReturn(UserAdapter_mock)
Run Code Online (Sandbox Code Playgroud)

之后,调用module_declaring_UserAdapter.UserAdapter(self.user_public_key)将返回UserAdapter_mock

这是手册中该部分的链接:https : //code.google.com/p/mockito-python/wiki/Stubbing#Modules

module_declaring_UserAdapter由于from ... import ...语句的工作方式,您必须小心选择正确的。从您的代码中,我会说您必须选择UserCompanyRateLimitValidation声明的模块。