在Mock上设置属性不起作用

时间:2014-03-14 15:38:25

标签: python unit-testing mocking

我试图创建一个库的模拟(Hammock)调用具有属性status_code的POST方法。这是我的测试代码:

def test_send_text(self):
    Hammock.POST = Mock(status_code=201)
    print Hammock.POST.status_code
    self.task.payload = fixtures.text_payload

    self.task.send_text()
    # ········
    Hammock.POST.assert_any_call()

当我打印Hammock.POST.status_code时,我得到了我期望的结果 - 201.但是,当我们进入代码时,我正在测试:

response = self.twilio_api('Messages.json').POST(data=self.payload)
print '*' * 10
print response
print response.status_code
if response.status_code == 201:
    self.logger.info('Text message successfully sent.')
else:
    raise NotificationDispatchError('Twilio request failed. {}. {}'.format(response.status_code,
        response.content))

事情变得奇怪。实际上,响应是Mock对象。但是,当我在测试中尝试时,response.status_code不是201,而是一个对象:<Mock name='mock().status_code' id='4374061968'>。为什么我的模拟属性在测试代码中工作而不在我测试的代码中?

1 个答案:

答案 0 :(得分:1)

问题是POST()。status_code vs POST.status_code。 POST.status_code确实== 201,但POST()的返回对象是一个全新的模拟对象。

您正在寻找的是

Hammock.POST = Mock()
Hammock.POST.return_value = Mock(status_code=201)