4

いくつかの障害点がある機能があります。

def setup_foo(creds):
    """
    Creates a foo instance with which we can leverage the Foo virtualization
    platform.

    :param creds: A dictionary containing the authorization url, username,
                  password, and version associated with the Foo
                  cluster.
    :type creds:  dict
    """

    try:
        foo = Foo(version=creds['VERSION'],
                  username=creds['USERNAME'],
                  password=creds['PASSWORD'],
                  auth_url=creds['AUTH_URL'])

        foo.authenticate()
        return foo
    except (OSError, NotFound, ClientException) as e:
        raise UnreachableEndpoint("Couldn't find auth_url {0}".format(creds['AUTH_URL']))
    except Unauthorized as e:
        raise UnauthorizedUser("Wrong username or password.")
    except UnsupportedVersion as e:
        raise Unsupported("We only support Foo API with major version 2")

関連するすべての例外がキャッチされていることをテストしたいと思います (ただし、現在はうまく処理されていません)。

私は合格する最初のテストケースを持っています:

def test_setup_foo_failing_auth_url_endpoint_does_not_exist(self):
    dummy_creds = {
        'AUTH_URL' : 'http://bogus.example.com/v2.0',
        'USERNAME' : '', #intentionally blank.
        'PASSWORD' : '', #intentionally blank.
        'VERSION'  : 2 
    }
    with self.assertRaises(UnreachableEndpoint):
        foo = osu.setup_foo(dummy_creds)

しかし、AUTH_URL が実際に有効な/到達可能な URL であるとテスト フレームワークに信じさせるにはどうすればよいでしょうか?

のモッククラスを作成しましたFoo

class MockFoo(Foo):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

私の考えは、呼び出しをモックし、例外を発生setup_fooさせることの副作用を取り除くことです。withに副作用を追加するUnreachableEndpoint方法は知っていますが、それらを削除するにはどうすればよいですか?Mockunittest.mock

4

2 に答える 2

0

偽の URL から http サーバーをモックアウトしたい場合は、HTTPrettyをチェックすることをお勧めします。ソケット レベルで URL をモック アウトするため、ほとんどの Python HTTP ライブラリが有効な URL であると騙すことができます。

ユニットテストには次の設定をお勧めします。

class FooTest(unittest.TestCase):
    def setUp(self):
        httpretty.register_uri(httpretty.GET, "http://bogus.example.com/v2.0",
                       body='[{"response": "Valid"}]',
                       content_type="application/json")
    @httpretty.activate
    def test_test_case(self):
        resp = requests.get("http://bogus.example.com/v2.0")
        self.assertEquals(resp.status_code, 200)

モックはデコレータで装飾されたスタックにのみ適用されるため、http.activateモックしたくないコード内の他の場所にリークしないことに注意してください。それが理にかなっていることを願っています。

于 2016-10-07T14:53:50.447 に答える