【问题标题】:Python Mock getting address instead return_valuePython Mock 获取地址而不是 return_value
【发布时间】:2014-06-26 12:53:42
【问题描述】:

我正在尝试转接电话以检查用户全名。我已经使用 mock 编写了以下方法。

def test_UserDisplayName(self):
    appModel = Mock()
    eval = appModel.eval.return_value
    eval.userDisplayName.return_value = 'JohnDoe'
    self._SummaryModel.AppModel = appModel
    actual = self._SummaryModel.UserDisplayName()
    self.assertEqual(actual, 'JohnDoe')

这是它正在调用的方法。

def UserDisplayName(self):
    return self.AppModel().eval().userDisplayName()

如果我将调试器附加到上述行并在 shell 中运行它就可以工作

[PAUSED] >>> self.AppModel().eval().userDisplayName()
'JohnDoe'
[PAUSED] >>> 

但是当运行它的测试用例失败时,我得到的是地址而不是值。

   ======================================================================
   FAIL: test_UserDisplayName (unittests.model.SummaryModelTest)
   ----------------------------------------------------------------------
   Traceback (most recent call last):
     File "/unittests/summary_model.py", line 112, in test_UserDisplayName
       self.assertEqual(actual, 'JohnDoe')
   AssertionError: <Mock name='mock.userDisplayName()' id='233406864'> != 'JohnDoe'

   ----------------------------------------------------------------------
   Ran 1 test in 0.010s

   FAILED:  (failures=1)

我做错了什么?

【问题讨论】:

    标签: python unit-testing mocking return-value


    【解决方案1】:

    您的代码也调用了AppModel,因此您需要为此调整其他引用:

    eval = appModel.return_value.eval.return_value
    

    演示:

    >>> from unittest.mock import Mock
    >>> appModel = Mock()
    >>> eval = appModel.return_value.eval.return_value
    >>> eval.userDisplayName.return_value = 'JohnDoe'
    >>> appModel().eval().userDisplayName()
    'JohnDoe'
    

    但是,您的&lt;Mock name='mock.userDisplayName()' id='233406864'&gt; 对象显示名称为mock.userDisplayName(),这表明返回值是通过使用self.AppModel.userDisplayName()直接 生成的。

    【讨论】:

    • 添加了上面的行但它仍然不起作用,当我附加调试点时它也不起作用。 code [暂停] >>> self.AppModel().eval().userDisplayName() [暂停] >>>
    • @Eamonn:测试该表达式的每个单独步骤,看看是否返回了与您的测试设置相同的 same mock。那么self.AppModel() 是否返回appModel.return_value
    • 我将dir() 放在每个步骤上,所以我从self.AppModel() 开始,我可以看到'eval',然后当我在self.AppModel().eval() 上执行dir() 时,我可以看到userDisplayName。跨度>
    • @Eamonn:查看您的 AssertionError 我没有看到模拟的预期 mock().eval().userDisplayName() 名称。你确定UserDisplayName是如何实现的吗?
    猜你喜欢
    • 2017-07-22
    • 2016-11-07
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    • 2019-02-01
    • 2018-11-15
    相关资源
    最近更新 更多