수입을 조롱하는 방법, (모의 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 하나의 플랫폼에서는 작동하지만 매일 테스트를 실행하는 Linux에서는 작동하지 않는 종속성이 있었으므로 테스트를 위해 종속성을 조롱해야했습니다. 다행히도 블랙 박스였습니다. 상호 작용을 많이 할 필요가 없었습니다.)
조롱 부작용
부록 : 실제로, 시간이 걸린 부작용을 시뮬레이션해야했습니다. 그래서 잠을 자려면 객체의 방법이 필요했습니다. 다음과 같이 작동합니다.
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__
.