模拟与路径混淆

时间:2015-11-12 00:06:54

标签: python unit-testing mocking

我在Python 2.6上使用mock进行了测试。

@patch('testme.check.RE.query')
def test_check(query):
  query.filter.one = MagicMock(return_value=None)
  ....
  assert against_experiment(cl, ei, cd)

在我要测试的模块中,我有

def check_against_experiment(c, e, c):
  re = RE.query.filter(RE.e_id == e).one()

两个问题:

检查re = RE.query.filter(RE.e_id == e).one()时,我看到<MagicMock name='query.filter().one()' id='62856528'>

为什么不返回None

另一个问题是,当我将@path('testme.check.RE.query')更改为@path('testme.check.RE.query')并将query.filter.one更改为query.one时,我注意到没有任何内容被嘲笑。为什么会这样?

2 个答案:

答案 0 :(得分:0)

当您在被测功能中呼叫RE.query.filter(RE.e_id == e)时,它会返回一个新的未配置 MagicMock,然后您正在调用其one function,生成默认值return_value

您可能希望将return_value的{​​{1}}设置为filter函数返回Mock的新one

答案 1 :(得分:0)

简短回答是你要做的是

query.filter.return_value.one.return_value = None

默认模拟的return_value属性是MagickMock对象(AFAIK被分配为惰性属性)。

恕我直言尽量避免这种模拟配置,让你的类/功能更清晰,更窄,以避免对象浏览。这些测试使源和测试纠结,并创建一个坚实的围栏来进行重构。

关于第二个问题,我可以指出Where to Patch 必须阅读文件。从你所说的不可能找到根本原因我可以打赌答案总是在本文档的章节中。

相关问题