我希望确保我的单元测试不会尝试连接互联网,有没有一种方法在它们这样做时引发异常?
曾经有一个类似的问题Python:用于测试目的阻止网络连接?,但是那里提出的解决方案会阻止所有套接字连接,包括数据库连接,这对Django测试是不可接受的。
我希望确保我的单元测试不会尝试连接互联网,有没有一种方法在它们这样做时引发异常?
曾经有一个类似的问题Python:用于测试目的阻止网络连接?,但是那里提出的解决方案会阻止所有套接字连接,包括数据库连接,这对Django测试是不可接受的。
if 'test' in sys.argv:
# Block Internet access during tests
import urllib2
import httplib
import httplib2
def _raise_http_error(*args, **kwargs):
raise urllib2.URLError("I told you not to use the Internet!")
class AngryHandler(urllib2.BaseHandler):
handler_order = 1
def default_open(self, req):
_raise_http_error()
opener = urllib2.build_opener(AngryHandler)
urllib2.install_opener(opener)
_HTTPHandler = urllib2.HTTPHandler
urllib2.HTTPHandler = AngryHandler
httplib.HTTPConnection.connect = lambda self: None
httplib.HTTPSConnection.connect = lambda self: None
httplib.HTTPConnection.request = _raise_http_error
httplib.HTTPSConnection.request = _raise_http_error
httplib2.Http.request = _raise_http_error
@vcr.use_cassette('fixtures/vcr_cassettes/synopsis.yaml')
def test_iana():
response = urllib2.urlopen('http://www.iana.org/domains/reserved').read()
assert 'Example domains' in response
支持使用以下库进行的任何请求:
httpretty
可以解决这个问题。
编写一个自定义测试运行器,在测试套件中仅禁用第三方API调用。
# common/test_runner.py
import httpretty
from django.test.runner import DiscoverRunner
class CustomTestRunner(DiscoverRunner):
def run_tests(self, *args, **kwargs):
with httpretty.enabled(allow_net_connect=False):
return super().run_tests(*args, **kwargs)
TEST_RUNNER = "common.test_runner.CustomTestRunner"
httpretty.errors.UnmockedError
异常。或者,如果您的项目使用responses
库,responses.activate
或responses.start
也可起到类似的作用。