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



我在为 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)

我必须测试这个类。我已经写了这样的测试用例。我试图模拟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)

在这里,如果您看到我已经模拟了来自可测试函数的 get_user_company_rate_limit() 调用,container = self.adapter.get_user_company_rate_limit() 但我仍然无法弄清楚我可以用什么方式嘲笑这个电话,

 self.adapter = UserAdapter(user_public_key)

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

在 Python 中创建对象非常类似于对类对象的函数调用。 UserCompanyRateLimitValidation正在"调用"UserAdapter(user_public_key)。您希望存根该"调用"的返回值以返回UserAdapter_mock

您可以像存根

模块中的函数一样存根。您缺少的行是:

when(module_declaring_UserAdapter)
    .UserAdapter(self.user_public_key)
    .thenReturn(UserAdapter_mock)

之后,呼叫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的模块。

这是另一种看待它的方式。假设我有这段代码,我想在其中模拟MyClass

from some.module import MyClass
class AnotherClass:
    def __init__(self):
        self.my_class = MyClass()

人们通常会如上所示调用导入。通过对导入进行一些轻微的修改,我们可以使其进入可以使用 mockito 模拟MyClass状态:

from some import module
class AnotherClass:
    def __init__(self):
        self.my_class = module.MyClass()

然后模拟将像这样工作:

from some import module
when(module).MyClass().thenReturn(mock())

相关内容

  • 没有找到相关文章

最新更新