Django中的模拟请求

1 投票
3 回答
2469 浏览
提问于 2025-04-21 02:56

我有一个这样的函数:

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 个回答

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"

试试看这个方法,看看是否有效,如果需要更多的改进或者增强功能,告诉我哦。

1

你可以使用HTTPretty(https://github.com/gabrielfalcao/HTTPretty),这是一个专门用来做这种模拟的库。

0

经过不断的测试,我更喜欢用这个来模拟请求。希望对其他人有帮助。

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

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

撰写回答