在为 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)
如果您看到我已经通过testable函数container = self.adapter.get_user_company_rate_limit()
模拟了get_user_company_rate_limit()调用
但我仍然无法弄清楚我可以模仿这个电话的方式,
self.adapter = UserAdapter(user_public_key)
答案 0 :(得分:2)
如果你知道这个诀窍就很简单了。
在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
的模块。
答案 1 :(得分:1)
这是另一种看待它的方式。假设我有这段代码,我想在其中模拟 MyClass
:
from some.module import MyClass
class AnotherClass:
def __init__(self):
self.my_class = MyClass()
人们通常会如上所示调用导入。通过对导入进行一些轻微修改,我们可以使其进入 MyClass
可以使用 mockito 模拟它的状态:
from some import module
class AnotherClass:
def __init__(self):
self.my_class = module.MyClass()
然后模拟会像这样工作:
from some import module
when(module).MyClass().thenReturn(mock())