Django中的模拟请求
我有一个这样的函数:
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()