我正在尝试构建单元测试并且一直在使用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>
我想知道返回重定向的必要性。仅修补单个方法时,我没有遇到过这个问题。
答案 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_creds
和mock_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'。