2

我正在写一个单元测试。如何在 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 以获得预期的响应?

4

1 回答 1

0

即使我广泛使用模拟和修补,我认为您的情况也不需要它。conf是 aMyValidator的公共属性,您只需要根据需要更改它即可。

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
        }

测试类应该在哪里

@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 尝试访问数据库、使用网络资源、启动新线程等时。

于 2015-03-20T13:00:15.523 回答