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

私はモックとパッチを広範囲に使用していますが、あなたのケースでは必要ないと思います。confMyValidatorの 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、辞書へのアクセスや、変更が行われる小さなコンテキストには関心がないため、これ以上何も提供できません。他のテストで他の値が必要な場合は、すべてのテストで同じように構成するため、他のテストの動作を変更せずに使用でき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 に答える