0

関数のリストをテストするテストケースを書きたいと思います。これが私がやりたいことの例です:

from mock import Mock
def method1 ():
    pass

def method2 ():
    pass

## The testcase will then contain:
for func in method_list:
    func = Mock()
    # continue to setup the mock and do some testing

達成したいことは次のとおりです。
ステップ1)ローカルメソッド変数をmethod_listの各項目に割り当てます
。ステップ2)メソッドにモンキーパッチを適用します。この例では、mock.Mockオブジェクトを使用しています

実際に発生するのは次のとおりです。
ステップ1)メソッドがmethod_listからアイテムに正常に割り当てられます-OK
ステップ2)メソッドがオブジェクトに割り当てられますMock()-NOK

ステップ2で必要だったのは、method_listからアイテムを取得することでした。たとえばmethod1をMock()オブジェクトに割り当てます。最終的には、methodとmethod1の両方が同じMock()オブジェクトを指すことになります。

私が本質的に行っているのはa=b
a = c
であり、c==bを期待していることに気づきました。

どういうわけかbへのポインタを取得しないと、これは実際には不可能だと思いますか?

4

3 に答える 3

1

ええと、method_listを単純に変更するのはどうですか?

for i in range(len(method_list)): # xrange in Python 2
    method_list[i] = Mock()

あなたが説明することは、ポインタよりもC++参照に近いです。Pythonを含め、そのようなセマンティクスを持つ言語はほとんどありません(いくつかは、参照渡しのための特別なキーワードを提供します)。

于 2010-08-26T13:48:20.377 に答える
1

私があなたを正しく理解しているなら、あなたは変数 method1が指すものを変更したいですか?そうですか?

これを行うには、ローカル変数のディクショナリのエントリを変更します。

for method_name in [ 'method1', 'method2' ]:
    locals()[ method_name ] = Mock( )

以前のコードが希望どおりに機能しない理由はfunc、関数への参照であるためですmethod1。isに割り当てることで、ポイントを変更するだけです。

これを実行してもよろしいですか?

モンキーパッチは厄介で、多くの問題を引き起こす可能性があります。

于 2010-08-26T14:24:40.097 に答える
1

このようなもの?

from mock import Mock
def method1 ():
    pass

def method2 ():
    pass

method_list=list(f for f in globals() if hasattr(globals()[f],'__call__') and f.startswith('method'))
print method_list
## The testcase will then contain:
for func in method_list:
    globals()[func] = Mock(func)
    # continue to setup the mock and do some testing

しかし、これが賢明なことかどうかはわかりません。デコレータと関係があるように見えます。

于 2010-08-26T14:51:13.887 に答える