Django:阻止互联网连接进行测试

时间:2014-04-28 21:52:34

标签: python django unit-testing testing

我想确保我的单元测试不会尝试连接到Internet,有没有办法在他们这样做时引发异常?

有一个类似的问题Python: block network connections for testing purposes?,但是那里提出的解决方案会阻止所有套接字连接,包括数据库连接,这对于Django测试是不可接受的。

2 个答案:

答案 0 :(得分:4)

找到了一种方法来做到这一点。您可以将其粘贴到您的设置中。

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

答案 1 :(得分:1)

看看vcrpy:https://github.com/kevin1024/vcrpy

第一次运行测试时,它会发出外部请求。每次之后它都会使用从第一次调用中存储的夹具。外部请求永远不会再次发生,这是您正在尝试完成的任务。

在单元测试中使用装饰器非常简单:

@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
  • 博托
  • 龙卷风的AsyncHTTPClient