2017-09-27 7 views
0

私はdefenitionでエラーのある他のモジュールをインポートするモジュールを持っています。 テストする必要がありますが、インポートするとエラーが発生します。pythonでの偽の定義のテスト

私はpytest mockingを試みましたが、defenition後にオブジェクトにパッチを当てました。

+0

トレースバックを追加できますか? – AndMar

+0

インポートするモジュールに再帰インポートがあります。再帰の反復の1つに「undefied」エラーがあります。 – Dan

答えて

0

あなたは間違ったやり方をしようとしているように聞こえますが、とにかくそれをやり遂げる方法があります。テスト環境でインポート中にサブモジュールが失敗した場合、インポートを実行する前に偽のモジュールをsys.modulesにロードすることができます。そうすれば、サブモジュールは既にロードされており、実際のサブモジュールをインポートしようとはしません。

私は構文エラーでモジュールを作成:

# broken.py 

def disembodied_function(): 

その後、私はbroken.pyをインポートbar.pyを書きました。

# bar.py 

from broken import disembodied_function 

def do_bar(): 
    return disembodied_function() 

およびfoo.pyをインポートします。私はpython3 foo.pyを実行する場合

# foo.py 

from bar import do_bar 

print(do_bar()) 

は今、私はSyntaxErrorを取得します。これを回避するには

$ python3 foo.py 
Traceback (most recent call last): 
    File "foo.py", line 3, in <module> 
    from bar import do_bar 
    File "/home/don/workspace/scratch/bar.py", line 3, in <module> 
    from broken import disembodied_function 
    File "/home/don/workspace/scratch/broken.py", line 3 
    def disembodied_function(): 
          ^
SyntaxError: unexpected EOF while parsing 
$ 

私はbarをインポートする前に、私はbrokenモジュールの偽のバージョンを挿入することができます。

# foo2.py                                  

import imp 
import sys 

mock_broken = imp.new_module('broken') 
mock_broken.disembodied_function = lambda: 42 
sys.modules['broken'] = mock_broken 

from bar import do_bar 

print(do_bar()) 

今では文句なしbarをインポートすることができ、そしてそれはbrokenの偽のバージョンを呼び出します。ここではfoo.pyの新バージョンです。

$ python3 foo2.py 
42 
$ 
関連する問題