在Python 2.7中模拟布尔__bool__协议方法

Pee*_*ter 5 python unit-testing mocking python-2.7 python-requests

作为我的单元测试的一部分,我正在使用奇妙的请求库测试一些响应.你可以用这个库做的很酷的事情就是测试一个200OK状态代码的响应,只需调用:

r = requests.get("http://example.com")
if r:
    # success code, do something...
else:
    # error code, handle the error.
Run Code Online (Sandbox Code Playgroud)

这种方式在幕后工作的方式是请求更新__bool__()根据状态代码类型返回的响应的协议方法.

我想做的是能够requests.get()足够好地模拟响应对象,这样我不仅可以修补我有兴趣检查(status_code,json())的方法/属性,而且False每当我选择时都可以返回.

以下对我不起作用,因为一旦我r从上面的示例代码调用它,它返回<Mock id='2998569132'>计算结果的Mock对象True.

with mock.patch.object(requests, 'get', return_value=mock.MagicMock(
    # False, # didn't work
    # __bool__=mock.Mock(return_value=False), # throws AttributeError, might be Python2.7 problem
    # ok=False, # works if I call if r.ok: instead, but it's not what I want
    status_code=401,
    json=mock.Mock(
    return_value={
        u'error': {
            u'code': 401,
            u'message':
            u'Request had invalid authentication credentials.',
            u'status': u'UNAUTHENTICATED'
        }
    }
)
)) as mock_account_get_failure:
# mock_account_get_failure.return_value = False # overwrites what I just mocked with json() and status_code
Run Code Online (Sandbox Code Playgroud)

我认为,答案可能在于魔术惩戒协议方法的返回值,但读这里的是__bool__仅支持Python的3.0.

ntr*_*bng 2

在python2.7中,你应该mock__nonzero__而不是__bool__.

m = mock.MagicMock(__nonzero__=mock.Mock(return_value=False), status_code=400) m.status_code # > 400 bool(m) # > False