如何在 class 的 __init__ 方法中修补实例?
How to patch instances in __init__ method of a class?
我正在写一个单元测试。如何在 class MyValidator 的 init 方法中修补 self.conf?在我的单元测试中,我想创建一个伪造的 self.conf 并获得响应以对 self.conf 中的每个元素进行断言。
class MyValidator(wsgi.Middleware):
def __init__(self, app):
self.app = app
self.conf = {
'auth_uri': CONF.someuri
'admin_domain_name': CONF.somedomainname,
'admin_user': CONF.someuser,
'admin_password': CONF.get_admin_password(),
'domain_name': CONF.somedomainname
}
对于单元测试,我正在考虑做..(我知道这是错误的..但你明白了)
@mock.patch('my_module.MyValidator.__init__.conf')
def setUp(self, mock_config):
@webob.dec.wsgify()
def fake_app(req):
return webob.Response()
self.request = webob.Request.blank('/')
mock_config = {
'auth_uri': 'testuri'
....
....
}
self.middleware = MyValidator(fake_app)
def test_auth_uri(self):
auth_uri = 'testuri'
env_auth_uri = self.request.environ.get('auth_uri', None)
self.assertEqual(auth_uri, env_auth_uri)
应该如何修补 self.conf 以获得预期的响应?
即使我广泛使用模拟和修补,我也不认为你的情况需要它。 conf
是 MyValidator
的 public 属性,您只需根据需要更改它即可。
def setUp(self):
@webob.dec.wsgify()
def fake_app(req):
return webob.Response()
self.request = webob.Request.blank('/')
self.middleware = MyValidator(fake_app)
self.middleware.conf = {
'auth_uri': 'testuri'
....
....
}
在这种情况下 patch
不能再给你什么了,因为你对 dict 访问和一些较小的更改上下文不感兴趣。如果在其他一些测试中您需要一些其他值,您可以使用 self.middleware.conf.update(...)
或 self.middleware.conf[...]=...
而不更改其他测试的行为,因为 setUp()
以相同的方式为每个测试配置它。
如果 conf
是 MyValidator
的只读 属性(更好一点的设计),情况就会有所不同。在这种情况下,您需要对其进行修补以进行测试:
class MyValidator(wsgi.Middleware):
def __init__(self, app):
self.app = app
@property
def conf(self):
return {
'auth_uri': CONF.someuri
'admin_domain_name': CONF.somedomainname,
'admin_user': CONF.someuser,
'admin_password': CONF.get_admin_password(),
'domain_name': CONF.somedomainname
}
测试class应该在哪里
@mock.patch('my_module.MyValidator.conf', new_callable=PropertyMock)
def setUp(self, mock_conf):
@webob.dec.wsgify()
def fake_app(req):
return webob.Response()
self.request = webob.Request.blank('/')
mock_conf.return_value = {
'auth_uri': 'testuri'
....
....
}
self.middleware = MyValidator(fake_app)
def test_auth_uri(self):
auth_uri = 'testuri'
env_auth_uri = self.request.environ.get('auth_uri', None)
self.assertEqual(auth_uri, env_auth_uri)
补丁 __init__()
在极少数情况下很有用。例如,当 __init__
做一些工作并需要无法在测试环境中使用或不会使用的资源时。一个例子是当 init 尝试访问数据库、使用网络资源、启动新线程等时。
我正在写一个单元测试。如何在 class MyValidator 的 init 方法中修补 self.conf?在我的单元测试中,我想创建一个伪造的 self.conf 并获得响应以对 self.conf 中的每个元素进行断言。
class MyValidator(wsgi.Middleware):
def __init__(self, app):
self.app = app
self.conf = {
'auth_uri': CONF.someuri
'admin_domain_name': CONF.somedomainname,
'admin_user': CONF.someuser,
'admin_password': CONF.get_admin_password(),
'domain_name': CONF.somedomainname
}
对于单元测试,我正在考虑做..(我知道这是错误的..但你明白了)
@mock.patch('my_module.MyValidator.__init__.conf')
def setUp(self, mock_config):
@webob.dec.wsgify()
def fake_app(req):
return webob.Response()
self.request = webob.Request.blank('/')
mock_config = {
'auth_uri': 'testuri'
....
....
}
self.middleware = MyValidator(fake_app)
def test_auth_uri(self):
auth_uri = 'testuri'
env_auth_uri = self.request.environ.get('auth_uri', None)
self.assertEqual(auth_uri, env_auth_uri)
应该如何修补 self.conf 以获得预期的响应?
即使我广泛使用模拟和修补,我也不认为你的情况需要它。 conf
是 MyValidator
的 public 属性,您只需根据需要更改它即可。
def setUp(self):
@webob.dec.wsgify()
def fake_app(req):
return webob.Response()
self.request = webob.Request.blank('/')
self.middleware = MyValidator(fake_app)
self.middleware.conf = {
'auth_uri': 'testuri'
....
....
}
在这种情况下 patch
不能再给你什么了,因为你对 dict 访问和一些较小的更改上下文不感兴趣。如果在其他一些测试中您需要一些其他值,您可以使用 self.middleware.conf.update(...)
或 self.middleware.conf[...]=...
而不更改其他测试的行为,因为 setUp()
以相同的方式为每个测试配置它。
如果 conf
是 MyValidator
的只读 属性(更好一点的设计),情况就会有所不同。在这种情况下,您需要对其进行修补以进行测试:
class MyValidator(wsgi.Middleware):
def __init__(self, app):
self.app = app
@property
def conf(self):
return {
'auth_uri': CONF.someuri
'admin_domain_name': CONF.somedomainname,
'admin_user': CONF.someuser,
'admin_password': CONF.get_admin_password(),
'domain_name': CONF.somedomainname
}
测试class应该在哪里
@mock.patch('my_module.MyValidator.conf', new_callable=PropertyMock)
def setUp(self, mock_conf):
@webob.dec.wsgify()
def fake_app(req):
return webob.Response()
self.request = webob.Request.blank('/')
mock_conf.return_value = {
'auth_uri': 'testuri'
....
....
}
self.middleware = MyValidator(fake_app)
def test_auth_uri(self):
auth_uri = 'testuri'
env_auth_uri = self.request.environ.get('auth_uri', None)
self.assertEqual(auth_uri, env_auth_uri)
补丁 __init__()
在极少数情况下很有用。例如,当 __init__
做一些工作并需要无法在测试环境中使用或不会使用的资源时。一个例子是当 init 尝试访问数据库、使用网络资源、启动新线程等时。