【发布时间】:2021-03-07 13:30:32
【问题描述】:
我有一个像下面这样的单元测试:
# utilities.py
def get_side_effects():
def side_effect_func3(self):
# Need the "self" to do some stuff at run time.
return {"final":"some3"}
def side_effect_func2(self):
# Need the "self" to do some stuff at run time.
return {"status":"some2"}
def side_effect_func1(self):
# Need the "self" to do some stuff at run time.
return {"name":"some1"}
return side_effect_func1, side_effect_func2, side_effect_func2
#################
# test_a.py
def test_endtoend():
s1, s2, s3 = utilities.get_side_effects()
m1 = mock.MagicMock()
m1.side_effect = s1
m2 = mock.MagicMock()
m2.side_effect = s2
m3 = mock.MagicMock()
m3.side_effect = s3
with mock.patch("a.get_request", m3):
with mock.patch("a.get_request", m2):
with mock.patch("a.get_request", m1):
foo = a() # Class to test
result = foo.run()
作为foo.run() 代码运行的一部分,get_request 被多次调用。我想为get_request 方法的每个调用设置不同的副作用函数,在本例中为side_effect_func1、side_effect_func2、side_effect_func3。但我注意到只有 m1 模拟对象处于活动状态,即只有 side_effect_func1 被调用,而不是其他 2。我该如何实现?
我也尝试了下面的方法,但实际的副作用函数没有被调用,它们总是返回function object,但实际上并不执行副作用函数。
# utilities.py
def get_side_effects():
def side_effect_func3(self):
# Need the "self" to do some stuff at run time.
return {"final":"some3"}
def side_effect_func2(self):
# Need the "self" to do some stuff at run time.
return {"status":"some2"}
def side_effect_func1(self):
# Need the "self" to do some stuff at run time.
return {"name":"some1"}
all_get_side_effects = []
all_get_side_effects.append(side_effect_func1)
all_get_side_effects.append(side_effect_func2)
all_get_side_effects.append(side_effect_func3)
return all_get_side_effects
#########################
# test_a.py
def test_endtoend():
all_side_effects = utilities.get_side_effects()
m = mock.MagicMock()
m.side_effect = all_side_effects
with mock.patch("a.get_request", m):
foo = a() # Class to test
result = foo.run()
【问题讨论】:
标签: python mocking pytest side-effects