インポートをモックする方法(モックAB)?
モジュールAの上部にはインポートBが含まれています。
簡単です。インポートする前にsys.modulesのライブラリをモックするだけです。
if wrong_platform():
sys.modules['B'] = mock.MagicMock()
そして、A
Bのオブジェクトから返される特定のタイプのデータに依存しない限り:
import A
うまくいくはずです。
あなたも模倣することができますimport A.B
:
これはサブモジュールがある場合でも機能しますが、各モジュールをモックしたいと思うでしょう。これがあるとしましょう:
from foo import This, That, andTheOtherThing
from foo.bar import Yada, YadaYada
from foo.baz import Blah, getBlah, boink
モックするには、上記を含むモジュールをインポートする前に、以下を実行します。
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
(私の経験:Windowsの1つのプラットフォームで機能する依存関係がありましたが、毎日のテストを実行するLinuxでは機能しませんでした。そのため、テストの依存関係を模擬する必要がありました。幸い、それはブラックボックスでした。多くのインタラクションを設定する必要はありませんでした。)
偽の副作用
補遺:実際には、時間がかかる副作用をシミュレートする必要がありました。したがって、オブジェクトのメソッドが1秒間スリープする必要がありました。これは次のように機能します。
sys.modules['foo'] = MagicMock()
sys.modules['foo.bar'] = MagicMock()
sys.modules['foo.baz'] = MagicMock()
# setup the side-effect:
from time import sleep
def sleep_one(*args):
sleep(1)
# this gives us the mock objects that will be used
from foo.bar import MyObject
my_instance = MyObject()
# mock the method!
my_instance.method_that_takes_time = mock.MagicMock(side_effect=sleep_one)
そして、実際のメソッドと同じように、コードの実行には少し時間がかかります。
Mock
一部の魔法の属性(__%s__
)にパッチを適用しないことに注意してください__name__
。