2016-08-11 97 views
1

ユニットテストのために書いている関数でグローバル変数の値を設定できません。Python 2.6 unittest - テスト中の関数のグローバル変数に使用する値を設定する方法

この機能は、テストで使用する準備ができていない可能性があります。または少なくとも簡単な方法でテストするために使用されるが、私はその問題を回避しようとしている。ここで

は、私がテストをしようとしている機能の例です。

def my_func_with_globals(filepath): 
    spos=filepath.find(__my_global_var1) 
    new_path = filepath[0:spos] + __my_global_var2 
    return new_path 

def some_function(): 
    ... 
    my_func_with_globals(filepath) 
    ... 

if __name__ = '__main__': 
    global __my_global_var1 
    __my_global_var1='value1' 
    global __my_global_var2 
    __my_global_var2='value2' 
    ... 
    some_function() 

そしてここでは、私のテストの例です:

import unittest 
from my_module import * 

class UnitTestMyModule(unittest.TestCase): 
    def test_my_func_with_globals(self): 
    self.assertEqual(my_func_with_globals('arbitrary/file/path'), 'valid output') 

@のkdopenの提案を使用して私のテストのもう一つの例(私に同じエラーになります):

import unittest 
import my_module 

class UnitTestMyModule(unittest.TestCase): 
    def test_my_func_with_globals(self): 
     my_module.__my_global_var1='some/value' 
     my_module.__my_global_var2='second_val' 
     self.assertEqual(my_module.my_func_with_globals('arbitrary/file/path'), 'valid output') 

私はエラーを取得しておいてください。

NameError: global name '__my_global_var1' is not defined.

私はいくつかのことを試しましたが、何もできません。 unittest.mock.patchを使用すると完全に動作するように見えますが、私は現在v2.6.4で何をしているのでしょうか。

答えて

1

グローバルは二重先頭のアンダースコアで定義されているため、from my_module import *ステートメントではインポートされません。

あなたは以下でそれらにアクセスすることができます:あなたはimport my_moduleを使用した場合

また
from my_module import __my_global_var1, __my_global_var2 

、あなたはなどmy_module.__my_global_var1としてそれらにアクセスすることができ

しかし、私はへの参照が表示されませんサンプルテストケースのグローバル変数

ここでは簡単な例を示します

a.py

__global1 = 1 

def foo(): 
    return __global1 

b.py:

import a 

print "global1: %d" % a.__global1 
print "foo: %d" % a.foo() 
a.__global1 = 2 
print "foo: %d" % a.foo() 

そしてb.py

$ python2.6 b.py 
global1: 1 
foo: 1 
foo: 2 

を実行しているUPDATE:

ダンそれ、あなたはD明白

を逃しましたテスト内の変数を確認してください。ifコマンドラインからpython my_moduleを実行した場合にのみ、そのコードはimportで実行されません。インポート時に

は、__name__はない__main__

ので、my_moduleに設定されます、はい - 彼らはあなたのユニットテストを呼び出す未定義です。

+0

私は実際には「インポートmy_module」をやって、その後my_module .__ my_global_var1とmy_module .__ my_global_var2と私のテストに使用する値を設定しようとしました、と私はまだ同じエラー「NameError:グローバル名 『を取得__my_global_var1』がdefintedされていません' – user797963

+0

私の元の投稿に例を追加しました... – user797963

+0

それは何か他のことが起こっているようです...実際には 'my_module'で定義されているグローバルか何か他のものをインポートしていますか(またはおそらく' __init__ .py') – kdopen

関連する問題