Python Django:出于测试目的阻止internet连接

Python Django:出于测试目的阻止internet连接,python,django,unit-testing,testing,Python,Django,Unit Testing,Testing,我想确保我的单元测试不会尝试连接到Internet,当它们连接到Internet时,是否有方法引发异常 有一个类似的问题,但提出的解决方案阻止了所有套接字连接,包括数据库连接,这对于Django测试是不可接受的。找到了一种方法。您可以将其粘贴到设置中 if 'test' in sys.argv: # Block Internet access during tests import urllib2 import httplib import httplib2

我想确保我的单元测试不会尝试连接到Internet,当它们连接到Internet时,是否有方法引发异常


有一个类似的问题,但提出的解决方案阻止了所有套接字连接,包括数据库连接,这对于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
看看vcrpy:

第一次运行测试时,它将发出外部请求。每次之后,它都会使用第一次调用时存储的设备。外部请求再也不会被提出,这正是您试图实现的

在单元测试中使用decorator非常简单:

@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
支持使用以下库发出的任何请求:

  • urllib2
  • urllib3
  • http.client(python3)
  • 请求(1.x和2.x) 版本)
  • httplib2
  • 博托
  • Tornado的AsyncHTTPClient

可能的@BradBeattie副本肯定不是,这个问题是关于模拟API调用的,我只想确保我模拟了所有连接到Internet的东西,并且没有遗漏任何东西(否则我希望测试失败)似乎更容易阻止socket,我认为socket位于所有这些库的上游。这里有一个这样的例子: