2015-03-20 3 views
2

Я пишу unittest. Как я могу исправить self.conf в init метод в классе MyValidator? В моем unittest я хочу создать поддельный self.conf и получить ответ, чтобы сделать утверждение каждого элемента в self.conf.Как исправить экземпляры в методе __init__ класса?

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 
     } 

Для UnitTest, я имею в виду делать .. (я знаю, что это неправильно .. но вы получите идею)

@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 получить предназначены ответ?

ответ

0

Даже я использую насмешливость и исправление, я не думаю, что ваш случай нуждается в этом. conf - это открытый атрибут MyValidator, и вам не нужно ничего больше, чем изменять его по мере необходимости.

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) 

Patch __init__() полезно в редких случаях. Например, когда __init__ выполняют некоторую работу и нуждаются в ресурсах, которые не могут использоваться или не будут использоваться в тестовой среде. Примером этого является, когда init пытается получить доступ к базам данных, использовать сетевые ресурсы, начать новый поток и так далее.

+0

Большое вам спасибо за ответ! –

+0

@killahjc У вас есть заметки о ответе? Взгляните на [кто-то отвечает] (http://stackoverflow.com/help/someone-answers) –