Python请求 - 模拟状态代码和响应

时间:2017-03-06 16:46:10

标签: python unit-testing mocking

所以我正在为Python项目编写一些单元测试,我想模拟对外部API的响应。

我的代码如下所示:

r = my_api_client.get(myurl)

try:
    if r.status_code == 200:
        my_response = r.json()
    elif r.status_code != 200:
        print "bad status code"
except Exception as e:
    raise

for x in my_response:
    ...

我的问题是如何模拟my_api_client以返回正确的状态代码和json对象?

我一直在尝试像my_api_client = mock.Mock(return_value={'status_code':200, 'json_obj': {'blah':'blah'}})

这样的事情

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

您可以为响应撰写复杂的模拟,如下所示:

ok_response_mock = mock.MagicMock()
type(ok_response_mock).status_code = mock.PropertyMock(return_value=200)
ok_response_mock.json.return_value = "{'blah':'blah'}"

这会创建一个MagicMock(当被要求使用非特定方法时不会抱怨),将status_code属性添加到它,返回200.并配置对.json()方法的JSON字符串响应。 / p>

因此,如果my_api_client是测试方法中的参数:

my_api_client_mock = mock.MagicMock()
my_api_client_mock.get.return_value = ok_response_mock
YourModule.YourMethod(my_api_client_mock)

这将创建mock参数,将其连接到先前创建的模拟响应并调用测试方法。 相反,如果my_api_client是导入的模块:

@mock.patch('MyModuleUnderTest.my_api_client')
def test_MyMethodUnderTest__response_ok__stuff_happens(self, api_client_mock):
   # code to create ok_response_mock
   api_client_mock.get.return_value = ok_response_mock

这将使用自动为您创建的模拟修补导入的模块,并将其作为参数放置到测试方法中。只要告诉那个模拟器就可以返回模拟的响应。