2016-12-19 8 views
5

PyPIからモジュールをインポートするアプリケーションがあります。 そのアプリケーションのソースコードのunittestを書きたいと思いますが、私はこれらのテストでPyPIのモジュールを使いたくありません。
私はそれを完全に模擬したい(テストマシンにはPyPIモジュールが含まれていないので、インポートは失敗します)。モジュール全体を模擬してください。

現在、私がunittestでテストしたいクラスをロードしようとするたびに、すぐにインポートエラーが発生します。私はその後、()command_module.runを使用し、多分エラーをインポート

try: 
    except ImportError: 

とキャッチを使用して考えました。 これはかなり危険な/醜いと思われ、別の方法があるかどうか疑問に思っていました。

もう1つのアイデアは、PyPIモジュールをラップするためのアダプタを作成することでしたが、まだ取り組んでいます。

私がPythonパッケージ全体を模倣できる方法を知っていれば、とても感謝しています。おかげさまで

答えて

2

Pythonのインポートシステムを掘り下げたい場合は、David Beazley's talkを強くお勧めします。

ここでは、モジュールの依存関係がない場合にモジュールをテストする例を示します。

bar.py - あなたはmy_bogus_moduleが

from my_bogus_module import foo 

def bar(x): 
    return foo(x) + 1 

mock_bogus.pyが欠落していたときにテストするモジュール -

from mock import Mock 
import sys 
import types 

module_name = 'my_bogus_module' 
bogus_module = types.ModuleType(module_name) 
sys.modules[module_name] = bogus_module 
bogus_module.foo = Mock(name=module_name+'.foo') 

test_bar.pyモックモジュールをロードしますあなたのテストで、ファイル - my_bogus_modulebar.pyをテスト利用できません。

import unittest 

from mock_bogus import bogus_module # must import before bar module 
from bar import bar 

class TestBar(unittest.TestCase): 
    def test_bar(self): 
     bogus_module.foo.return_value = 99 
     x = bar(42) 

     self.assertEqual(100, x) 

テストを実行するときにmy_bogus_moduleが実際には利用できないことを確認することで、おそらくそれを少し安全にする必要があります。また、何かをインポートしようとするpydoc.locate()メソッドを見て、失敗した場合はNoneを返すこともできます。それは公共の方法だと思われますが、それは実際には文書化されていません。

+0

これは私が探していたものです。 ありがとう! – TzurEl

関連する問題