私はモックしたいいくつかの高価な機能を持ついくつかのAを使用するテストBの下のシステムを持っていますが、BはAの複数のインスタンスを取得することに依存しています.
http://docs.python.org/3/library/unittest.mock.html#unittest.mock.patchは次のように述べています。しかし、私は理解していません、どのように:(
この例をどのように変更する必要がありますか:
import time
class A:
def say_hi(self):
print("lets do something horribly expensive")
time.sleep(2)
class B:
def __init__(self):
self.a_map = {}
def get_a(self):
a = A()
a.say_hi()
self.a_map[a] = True
with patch('__main__.A') as mockA:
b = B()
def side_effect():
# return DEFAULT # no success
return mockA # no success neither
# return mockA.clone() # :(
mockA.side_effect = side_effect # no help
# mockA.side_effect = [DEFAULT, DEFAULT, DEFAULT, DEFAULT, DEFAULT] # nope
# mockA.side_effect = [mockA, mockA, mockA, mockA, mockA] # nope
# mockA.side_effect = [DEFAULT, mockA, mockA, mockA, mockA] # nope, but hey! I get 2 instances in my key set now!
# mockA.side_effect = [DEFAULT, mockA, mockA.clone(), mockA.clone().clone(), mockA.clone().clone().clone()] # would work, but hey, seriously?
for _ in range(5):
b.get_a()
print(b.a_map)
assert len(b.a_map) == 5
次の出力が生成されます。
{<MagicMock name='A' id='139998588645520'>: True}
Traceback (most recent call last):
File "<stdin>", line 11, in <module>
AssertionError
(アサーションをモックしなくても成功しますが、10 秒かかります。)