Django中的模拟请求

时间:2014-09-11 14:46:10

标签: python django unit-testing mocking python-requests

我有这个功能:

def function_to_test(..):
    # some stuff

    response = requests.post("some.url", data={'dome': 'data'})

    # some stuff with response

我想做一个测试,但嘲笑 requests.post(“some.url”,data = {'dome':'data'})因为我知道它有效。我需要这样的东西:

def my tets():

    patch('requests.post', Mock(return_value={'some': 'values'})).start()

    # test for *function_to_test*

这可能吗?如果是这样,怎么样?

被修改

我找到了这些方法:

class MockObject(object):
        status_code = 200
        content = {'some': 'data'}

    # First way
    patch('requests.post', Mock(return_value=MockObject())).start()

    # Second way
    import requests
    requests.post = Mock(return_value=MockObject())

这些方法好吗?哪一个更好?另一个?

3 个答案:

答案 0 :(得分:1)

您可以使用HTTPretty(https://github.com/gabrielfalcao/HTTPretty),这是一个专为此类模拟而设的库。

答案 1 :(得分:1)

你可以使用flexmock。见下面的例子

假设您在文件./myfunc.py

中有功能
# ./myfunc.py
import requests

def function_to_test(..):
  # some stuff
  response = requests.post("www.google.com", data={'dome': 'data'})
  return response

然后测试用例在./test_myfunc.py

# ./test_myfunc.py
import flexmock as flexmock
import myfunc

def test_myfunc():
  (flexmock(myfunc.requests).should_recieve("post").with_args("www.google.com", data={"dome":
   "data"}).and_return({'some': 'values'}))

  resp = myfunc.function_to_test()
  assert resp["some"] == "values"

试试这个,看看是否有效或让我知道更多的改进/改进。

答案 2 :(得分:0)

继续测试和测试后,我更喜欢使用它来模拟请求。希望它能帮助别人。

class MockObject(object):
    status_code = 200
    content = {'some': 'data'}

patch('requests.post', Mock(return_value=MockObject())).start()