接続情報(たとえば、psycopg2
への接続のキーマップ値を持つ辞書)にデータベース名を動的に追加しようとしています。このため私はプロパティを使用しています。私が頭の中で働いていると思うのは、オブジェクト作成者に渡された情報を受け取り、次にcanvas_conn
辞書の'database'
属性を動的に設定してdatabase_name
を渡すことです。次に、@property
メソッドを追加しました。 canvas_conn
を更新するように変更された場合は、database_name
が表示されます。しかし、私の単体テストは、「データベース」のためにKeyError
で失敗しています。ここで @propertyはオブジェクト作成時に正しく更新されませんか?
class Shard(mu.PrettyStr):
def __init__(self,
database_name,
schema_name,
cluster_id,
shard_id,
historical_connect=False,
canvas_conn=config3.CANVAS_INFO,
analytics_conn=config3.REDSHIFT_POSTGRES_INFO_PROD):
"""
@type database_name: str
:param server_id:
@type schema_name: str
:param name:
@type cluster_id: str
:param cluster_id:
@type shard_id: str
:param shard_id:
@type historical_connect: bool
:param historical_connect:
@type canvas_conn: dict
:param canvas_conn:
@type analytics_conn: dict
:param analytics_conn:
"""
self._database_name = database_name
self.schema_name = schema_name
self.cluster_id = cluster_id
self.shard_id = shard_id
self.historical_connect = historical_connect
self._canvas_conn = canvas_conn
self.analytics_conn = analytics_conn
@property
def database_name(self):
return self._database_name
@database_name.setter
def database_name(self, name):
self._database_name = name
# force the new database name into the conn info
self._canvas_conn = self._canvas_conn
@property
def canvas_conn(self):
return self._canvas_conn
@canvas_conn.setter
def canvas_conn(self, database_info):
database_info['database'] = self._database_name
self._canvas_conn = database_info
そして、ここに私のユニットテストです:
def test_descriptor_correctly_sets_database_attribute(self):
test_data = ('server_id', 'db_name', 'cluster_id', 'shard_id', True)
test_shard = cu.Shard(*test_data)
self.assertEqual(
test_shard.canvas_conn['database'],
test_shard.database_name
)