我有这个功能:
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())
这些方法好吗?哪一个更好?另一个?
答案 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()