[英]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_creds
和mock_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.