嘲笑没有安装ssl

时间:2016-07-10 07:41:36

标签: python unit-testing ssl

我正在尝试测试库的兼容性包装,而不是在没有SSL支持的情况下编译Python的可能性。

问题是使用以下语句检测到这一点。

try:
    import ssl
except ImportError:
    ssl = None

在兼容文件被加载(或重新加载)之前,如何在删除ssl导入时安全地模拟这个?不会破坏所有其他测试。

2 个答案:

答案 0 :(得分:1)

您可以将Mock()分配给ssl模块:

import sys
sys.modules['ssl'] = Mock()

在运行导入ssl的代码之前。

答案 1 :(得分:0)

我能够通过首先将模块保存为局部变量,然后将sys.modules中的ssl模块设置为None并重新加载我们正在测试的文件来实现我想要的行为。

测试完成后,我只需恢复sys.modules中的ssl模块,然后重新加载我正在测试的文件。

# Module we will be testing.
import my_package

def test_ssl_module_not_available(self):
    # Save the module we are going to modify.
    restore_module = sys.modules['ssl']
    try:
        # Set ssl import as None.
        sys.modules['ssl'] = None

        # Reload the code referencing the ssl module.
        imp.reload(my_package.compatibility)

        # Perform the tests.
        self.assertIsNone(compatibility.ssl)
        self.assertIsNone(compatibility.DEFAULT_SSL_VERSION)
        self.assertFalse(compatibility.SSL_SUPPORTED)
        self.assertFalse(compatibility.SSL_CERT_MAP)
        self.assertFalse(compatibility.SSL_VERSIONS)
    finally:
        # Restore the ssl module.
        sys.modules['ssl'] = restore_module
        imp.reload(compatibility)