2012-05-09 11 views
1

@unittest.skipIf(expression)で問題が発生しました。まあ、問題は、テストを開始する前に宣言され、値を割り当てられたデコレータ内の変数を使用し、テスト中にこの変数の値が変更された場合、デコレータに古い値が含まれるということです。たとえば:Settings.flag[@ unittest.skipIf decorator]の条件が古くなっています。

class Settings(object): 
    flag=False 
class TestCase(object): 

    # during the test variable is changed (in this module or another) 
    Settings.flag=True 

    @unittest.skipIf(Settings.flag==True) 
    def test_something(self): 
     ... 

値(これは関係ありません)他のモジュールまたはこのモジュールに変更することができます。どちらの場合も、test_somethingのコール中の条件Setting.flag==Trueは、すでに「真」の値に変更されていますが、「偽」の値を取ります。非常に奇妙なことですが、私はこのメカニズムがどのように機能するのか分かりません。このデコレータで使用される値は、テスト中に変更できないようです。おそらく、テスト中に変化する可能性のある特定の条件の時にテストをスキップするための興味深い方法があります。誰もこの問題にアプローチする方法を知っていますか?

+0

;-)私はこのストレートを取得してみましょう...それを私の指を置くことができない...見えます。 'flag'がtrueならテストをスキップします。それは本当です、あなたはテストをスキップします。後で、あなたは '旗'を変えます - あなたは時を経て戻って、魔法のように "切り刻まない"ようにしたいですか? – katrielalex

+0

いいえ。デフォルト値はFALSEです。テスト値がTRUEで変化している間は 'skipIf'はこの値をFALSEとして読み込みます。値は 'test_something'呼び出しの前に変更されています。 –

答えて

1

はい、これは予想される動作です。関数の引数は、関数の呼び出し時に評価されます。デコレータは、装飾される関数が定義されているときに呼び出される関数です。したがって、フラグは装飾された関数が定義されているときにテストされます。デコレータは、テストが何であったかを知る方法がありません。 TrueまたはFalse(または真実性または偽り)しか見られないため、後で評価するために条件を保存することはできません。

skipIf()が必要な場合は、ブール値ではなく、機能(例:lambda: Settings.flag==True)を使用する必要があります。次に、装飾された関数が実際に呼び出されたときに、この条件を後で評価することができます。しかし、実際にはそのようには機能しません。しかし、これはおそらく簡単に追加することができます。

Settings.flagの値が設定されるまで、ユニットテストを含むモジュールをインポートしないようにすると、この問題を回避できます。それまでは、テスト関数の定義(したがってデコレーション)が延期され、デコレータはフラグの目的の値にアクセスできます。あなたのコードがどのように構造化されているか分からず、これがあなたにとって実用的かどうかは分かりません。

また、何かが怪しいについてSettings.flag==Trueはかなり

+0

'@ unittest.skipIf(lambda test = Settings.flag:test == Trueの場合はTrue、" Test skipped ")'は期待通りに機能しませんが、それでもFALSEの値があります。デコレータでラムダを使用する方法のサンプルを提供できますか?たぶん私は間違ったことをしている –

+0

申し訳ありませんが、例えば上記の私はもちろん真の価値を持っています。問題ではありません - 問題はまだ存在します。値は変化しており、ラムダステートメントを使ったデコレータはまだ古い値を受け取ります。 –

+0

申し訳ありませんが、私は明確ではなかったと思います: 'skipIf()'は関数を受け入れるために書く必要があります。そうではないので、(Pythonのほとんどのオブジェクトのように)関数は 'True'です。 – kindall

関連する問題