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