2017-07-05 14 views
0

私はunittestを初めて利用しています。私はリスト内の値に基づいてテストケースをスキップしようとしています。Python unittest: 'self'は定義されていません

class UESpecTest(unittest.TestCase): 
    global testcases_exec_list 
    testcases = [] 
    testcases = testcases_exec_list 
    @unittest.skipIf('0' not in self.testcases, "Testcase input not given") 
    def test_retrieve_spec_info(self): 
     read_spec_info.open_csv(self.spec_info) 
     assert (bool(self.spec_info) == True) #Raise assertion if dictionary is empty 

私は自分がここに定義されていない理由を私はわからない以下のエラー

File "test_ue_cap_main.py", line 39, in UESpecTest 
    @unittest.skipIf('0' not in self.testcases, "Testcase input not given") 
NameError: name 'self' is not defined 

を取得しています。

+2

あなたの質問:なぜ* *「自己」が定義されていますか? –

+3

なぜそれが定義されると思いましたか?デコレータは*メソッドの外側にあり、インスタンスが作成される前にクラス定義時に実行されます。 – jonrsharpe

+0

ああ!意味をなさないありがとうございました – Gaara

答えて

3

selfは、JavaとJavascriptではthisのような魔法の変数ではありません。そのため、メソッドの最初のパラメータとして定義する必要があります。 selfがパラメータまたは他の種類の変数として定義されていない場合は、他の変数と同様に定義されていません。その名前は純粋に従来のものです。

あなたはクラスレベルにいるとき、あなたはで他の変数を使用することができます

selfthisに相当した場合の問題には、例えば、ちょうどクラスはありませんので、それはまだ意味がありませんが)クラスレベルで正常です。たとえば:

class A: 
    x = 1 
    y = 2 
    z = x + y # 3 

だから、selfを削除し、ちょうど'0' not in testcasesを言うことができます。

はまた、あなたが起こっているいくつかの奇妙なものを持っている:

global testcases_exec_list 
testcases = [] 
testcases = testcases_exec_list 
  1. あなたはすぐにそれをオーバーライドするためのラインtestcases = []が完全に冗長です。
  2. globalはアクセスのためのものではないため、global testcases_exec_listという行はおそらく役に立たない(クラス定義の残りの部分による)。
  3. testcases_exec_listがある場合、なぜtestcasesを定義していますか?これはコピーを作るのではなく、同じリストにすることを理解していますか?
1

selfは、selfが存在しないため定義されていません。クラス定義時にはselfはまだ作成されていません。 Pythonがselfを作成するのは、クラスのインスタンスに対してバインドされたメソッドを呼び出すときだけです。 selfは依然として通常の変数です。Pythonは暗黙的にバインドされたメソッドに渡します。

だからあなたの場合には、あなたがあるとしてだけtestcaseを使用し、selfを必要としません:

@unittest.skipIf('0' not in testcases, "Testcase input not given") 

クラスの名前空間の内部で、変数は、彼らがグローバルであるかのように、通常使用することができる定義された場合:

>>> class Class: 
    attr1 = 0 
    print(attr1) 


0 
>>> 
関連する問題