繁体   English   中英

Python Mock无法正确设置返回值

[英]Python Mock not correctly setting return value

我正在尝试构建单元测试,并且一直在使用模拟,但是在使用两个patch语句时,我无法设置适当的返回值。

@patch('pulleffect.lib.google.gcal_helper.validate_and_refresh_creds')
@patch('pulleffect.lib.google.gcal_helper.get_google_creds')
def test_get_calendar_list_for_gcalhelper_without_credentials(self, 
                                                              mock_get_google_creds, 
                                                              mock_validate_and_refresh_creds):
    mock_validate_and_refresh_creds = "redirect"
    mock_get_google_creds = "credentials"
    credentials = pulleffect.lib.google.gcal_helper.get_calendar_list("name","widget")
    assert b'redirect' in credentials

但是断言失败,而不是预期的字符串重定向,我改为

<MagicMock name = "validate_and_refresh_creds() id = 14054613955344>

我想知道重定向返回的必要条件是什么。 仅修补单个方法时,我还没有遇到此问题。

我能够解决以下问题

<MagicMock name = "foo()" id = number>

通过用以下代码替换我之前的代码而错误地出现:

from mock import MagicMock

def test_get_calendar_list_for_gcalhelper_without_credentials(self):

    rtn = { "redirect": "/gcal/authenticate"}       
    pulleffect.lib.google.gcal_helper.validate_and_refresh_creds = MagicMock(name = "sup", return_value  = rtn)
    pulleffect.lib.google.gcal_helper.get_google_creds = MagicMock(name = "sup2", return_value  = "redirect")
    credentials = pulleffect.lib.google.gcal_helper.get_calendar_list("name","widget")
        assert b'redirect' in credentials

这样可以正确设置返回值。

使用修补程序装饰程序创建的mock_get_google_credsmock_validate_and_refresh_creds是普通的模拟对象(Mock或MagicMock)。 直接分配不是设置返回值的正确方法。 使用return_value属性:

mock_validate_and_refresh_creds.return_value = "redirect"

您也可以在修补过程中进行设置:

patch采用任意关键字参数。 这些将在构造时传递给Mock(或new_callable)。

@patch('pulleffect.lib.google.gcal_helper.get_google_creds', return_value="redirect")

我建议您使用此解决方案。 您应该将函数移至辅助类,而应将其移至静态方法的用户类方法,因为可以通过这种方式模拟类。

class GCallHelper(object):
     @classmethond
     def validate_and_refresh(cls):
        ...
        return result

def test_get_calendar_list_for_gcalhelper_without_credentials(self):
    with patch('pulleffect.lib.google.gcal_helper') as mocked_gcal:
        mocked_gcal.return_value.validate_and_refresh_creds.return_value = 'redirect'
        mocked_gcal.return_value.get_google_creds.return_value = 'credentials'

        credentials = pulleffect.lib.google.gcal_helper.get_calendar_list("name","widget")
        assert b'redirect' in credentials

ps并且您在示例中忘记了“ return_value”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM