Python模拟没有正确设置返回值

时间:2014-06-03 06:49:10

标签: python unit-testing mocking

我正在尝试构建单元测试并且一直在使用mock,但是在使用两个补丁语句时,我无法设置正确的返回值。

@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>

我想知道返回重定向的必要性。仅修补单个方法时,我没有遇到过这个问题。

3 个答案:

答案 0 :(得分:1)

我能够解决

的问题
<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

这允许正确设置返回值。

答案 1 :(得分:1)

使用补丁装饰器创建的

mock_get_google_credsmock_validate_and_refresh_creds是普通的模拟对象(Mock或MagicMock)。直接赋值不是设置返回值的正确方法。使用return_value属性:

mock_validate_and_refresh_creds.return_value = "redirect"

您也可以在patching期间设置它:

  

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

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

答案 2 :(得分:0)

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

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

P.S。你忘了你的例子中的'return_value'。