私は、SVN からいくつかのコードをチェックアウトしてビルドすることを想定した Python モジュールに取り組んでいます。いくつかのレガシー コードを何度もリファクタリングした後、コードをかなり適切にカバーできましたが、 pysvnを使用するコードに大きな穴があります。
確かに、Mock オブジェクトの概念は私にとって新しいものですが、MiniMockとpymoxのドキュメントをいくつか読んだ後(私の環境ではどちらも利用可能です)、pysvn の出力をキャプチャしてそれを返す必要があるという結論に達しました。私のテストコード。
しかし、ここで私はピクルスの中にいることに気づきます(駄洒落を許してください)。pysvn.Client() コマンドから返されたオブジェクトは、それらをピクルしようとしても、比較しようとしてもうまく動作しません。
pysvn またはその他の非 Pythonic 動作オブジェクトをシリアル化またはモックする方法の提案はありますか?
当然のことながら、私はこの問題に間違った方向から取り組んでいること、または私が単なる馬鹿であることを喜んで受け入れます。その場合、どんなアドバイスも役に立ちます。
追加情報 0:
一部のpysvn
オブジェクトは、そのプロパティにdict
アクセスすることで に縮小でき、これを適切なdata
dict
__init__()
例えば:
>>> svn=pysvn.Client()
>>> svn.list('http://svn/svn/')[0][0]
<PysvnList u'http://svn/svn'>
>>> d=svn.list('http://svn/svn/')[0][0].data
>>> pysvn.PysvnList(d)
<PysvnList u'http://svn/svn'>
ただし、このオブジェクト内には、ピクルできないオブジェクトがいくつかある可能性があります。
>>> cPickle.dumps(d)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
cPickle.UnpickleableError: Cannot pickle <type 'node_kind'> objects
追加情報 1:
@Hについては。Dunlopのリクエストです。これは私のコードの (簡略化された) スニペットです。SVN からリストを取得し、ユーザーがそのリストから項目を選択できるようにします。
class Menu(object):
"""a well covered class"""
# ...
class VersionControl(object):
"""A poorly covered class"""
def __init__(self):
self.svn = pysvn.Client()
# ...
def list(self, url):
"""svn ls $url"""
return [os.path.basename(x['path']) for (x,_) in self.svn.list(url)[1:]]
def choose(self, choice, url):
"""Displays a menu from svn list, and get's the users choice form it.
Returns the svn item (path).
"""
menu = Menu(prompt="Please choose %s from list:\n" % choice,
items=self.list(url),
muliple_choice=False)
menu.present()
return menu.chosen()