【问题标题】:How to use unittest.mock package in both Python 3.8+ and Python 2.7+?如何在 Python 3.8+ 和 Python 2.7+ 中使用 unittest.mock 包?
【发布时间】:2019-12-16 19:09:28
【问题描述】:

我正在编写一个 API 客户端库。该库旨在支持 Python 2.7+ 和 Python 3+。

现在编写测试并尝试使用MagicMockpatch。根据此处的文档https://cpython-test-docs.readthedocs.io/en/latest/library/unittest.mock.html,如果我安装mock(使用pip install mock==3.0.5),则有unittest.mock 的后向端口。但是当我将它安装在我的 docker 映像中时,该行:

from unittest.mock import patch

仍然失败:

Traceback (most recent call last):
  File "/opt/conda/envs/py27/lib/python2.7/runpy.py", line 174, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/opt/conda/envs/py27/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/library_wq-api-utils/wq_api_utils/tests/tests.py", line 3, in <module>
    from unittest.mock import patch
ImportError: No module named mock

我可能对这里的文档感到困惑,但如果能帮助我在 Python 2.7 和 3.8 中运行相同的代码,我将不胜感激。谢谢!

【问题讨论】:

  • 我喜欢这样。让我试一试,谢谢!

标签: python python-3.x python-2.7 python-unittest


【解决方案1】:

我使用以下代码来防止全局命名空间污染:

import unittest
try:
    import unittest.mock
except ImportError:
    import mock
    unittest.mock = mock

【讨论】:

    【解决方案2】:

    Python 2.x

    使用这个导入:

    from mock import patch, MagicMock
    

    Python 3.3+

    mock 已包含在unittest 模块中,可以通过以下方式导入:

    from unittest.mock import patch, MagicMock
    

    在运行时检查 python 版本

    import sys
    if sys.version_info[0] < 3:
        from mock import patch, MagicMock
    if sys.version_info[0] > 3:
        from unittest.mock import patch, MagicMock
    

    它在做什么

    sys.version_info[0] 是主要版本号,而sys.version_info[1] 将提供次要版本号。

    python版本检查会检查是python2还是python3

    【讨论】:

    • 谢谢,但这并不能解决我的问题。我需要相同的代码与两个版本兼容 - 问题的重点是让我能够运行完全相同的代码。
    • @SwaggaTing 啊对不起,我没有抓住那部分,我已经编辑了我的答案,包括在运行时检查 python 版本并导入正确的包。
    • 谢谢我的意思!现在我想知道哪个答案更“pythonic” - 检查版本,或使用 try/except ..
    • try/except 看起来更干净。我认为,如果您在发布另一个主要 python 修订版时重新访问代码,您可以从上面的代码中读取您正在实施版本控制,并且可以为该主要版本实施新的版本控制。也许使用 try/except,为第三个选项实施另一个版本控制并不是解决问题的方法。我认为这两个答案对于当前可用的两个 python 版本都是可以接受的。
    【解决方案3】:

    一种可能的解决方案是使用 try-except:

    try:
        from unittest.mock import patch, MagicMock
    except ImportError:
        from mock import patch, MagicMock
    

    【讨论】:

      猜你喜欢
      • 2019-05-27
      • 2017-11-04
      • 2020-02-03
      • 2020-09-06
      • 2023-03-23
      • 1970-01-01
      • 2013-08-12
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多