首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:使用pytest.fixture模拟ImportError

Python:使用pytest.fixture模拟ImportError
EN

Stack Overflow用户
提问于 2019-10-31 00:45:37
回答 1查看 202关注 0票数 0

我正在尝试对一个辅助函数进行测试,该函数会对导入成功与否做出反应。

成功的测试是有效的,但不是失败的,你知道为什么吗?

帮助器:homeassistant/component/owntracks/helper.py

代码语言:javascript
复制
"""Helper for OwnTracks."""
try:
    import nacl
except ImportError:
    nacl = None

import logging

_LOGGER = logging.getLogger(__name__)


def supports_encryption() -> bool:
    """Test if we support encryption."""
    _LOGGER.info(nacl)
    return nacl is not None

我的测试:tests/component/owntracks/ test _helper.py

代码语言:javascript
复制
"""Test the owntracks helper."""
from unittest.mock import patch
import pytest
import logging

from homeassistant.components.owntracks.helper import supports_encryption

_LOGGER = logging.getLogger(__name__)

@pytest.fixture(name="nacl_imported")
def mock_nacl_imported():
    """Mock a successful import."""
    with patch("homeassistant.components.owntracks.helper.nacl"):
        yield


@pytest.fixture(name="nacl_not_imported")
def mock_nacl_not_imported():
    """Mock non successful import."""
    with patch("homeassistant.components.owntracks.helper.nacl") as mock_import:
        mock_import.return_value = ImportError()
        yield mock_import


def test_supports_encryption(nacl_imported):
    """Test if env supports encryption."""
    _LOGGER.info(supports_encryption())
    assert supports_encryption()


def test_supports_encryption_failed(nacl_not_imported):
    """Test if env does not support encryption."""
    _LOGGER.info(supports_encryption())
    assert not supports_encryption()

还尝试了:

代码语言:javascript
复制
    with patch("homeassistant.components.owntracks.helper.nacl", return_value=None):
        yield

AND

    with patch("homeassistant.components.owntracks.helper.nacl", side_effect=ImportError()):
        yield

测试日志:

代码语言:javascript
复制
 py.test tests/components/owntracks/test_helper.py
Test session starts (platform: linux, Python 3.7.4, pytest 5.2.2, pytest-sugar 0.9.2)
rootdir: /home/quentin.pollet@sglk.local/Documents/home-assistant, inifile: setup.cfg
plugins: timeout-1.3.3, cov-2.8.1, requests-mock-1.7.0, aiohttp-0.3.0, sugar-0.9.2
collecting ... 
 tests/components/owntracks/test_helper.py ✓                                       50% █████     

―――――――――――――――――――――――――――――――― test_supports_encryption_failed ――――――――――――――――――――――――――――――――

nacl_not_imported = <MagicMock name='nacl' id='139733318227280'>

    def test_supports_encryption_failed(nacl_not_imported):
        """Test if env does not support encryption."""
        _LOGGER.info(supports_encryption())
>       assert not supports_encryption()
E       assert not True
E        +  where True = supports_encryption()

tests/components/owntracks/test_helper.py:34: AssertionError
------------------------------------- Captured stderr call --------------------------------------
INFO:homeassistant.components.owntracks.helper:<MagicMock name='nacl' id='139733318227280'>
INFO:tests.components.owntracks.test_helper:True
INFO:homeassistant.components.owntracks.helper:<MagicMock name='nacl' id='139733318227280'>
--------------------------------------- Captured log call ---------------------------------------
INFO     homeassistant.components.owntracks.helper:helper.py:14 <MagicMock name='nacl' id='139733318227280'>
INFO     tests.components.owntracks.test_helper:test_helper.py:33 True
INFO     homeassistant.components.owntracks.helper:helper.py:14 <MagicMock name='nacl' id='139733318227280'>

 tests/components/owntracks/test_helper.py ⨯                                      100% ██████████

Results (0.15s):
       1 passed
       1 failed
         - tests/components/owntracks/test_helper.py:31 test_supports_encryption_failed

我是Python的新手,但很有动力,要友善;)

EN

回答 1

Stack Overflow用户

发布于 2019-11-04 15:20:26

从您给定的详细信息可以看出,方法supports_encryption()将检查nacl的导入状态。如果未安装,则会将nacl值更改为False。此外,在此之后,您将使用True/False验证nacl的值(nacl不是None将返回True,如果不是None)。

supports_encryption()的返回值始终为True。

在测试方法test_supports_encryption_failed()中,您使用了assert而不是supports_encryption(),,这就是它失败的原因。

要模拟imports值,请使用以下代码:-

代码语言:javascript
复制
$ pytest -vsx test_11.py
platform linux2 -- Python 2.7.15+, pytest-4.6.6, py-1.8.0, pluggy-0.13.0 -- /usr/bin/python
cachedir: .pytest_cache
metadata: {'Python': '2.7.15+', 'Platform': 'Linux-4.15.0-60-generic-x86_64-with-Ubuntu-18.04-bionic', 'Packages': {'py': '1.8.0', 'pytest': '4.6.6', 'pluggy': '0.13.0'}, 'Plugins': {u'html': u'1.22.0', u'metadata': u'1.8.0'}}
rootdir: /home/nikhilesh
plugins: html-1.22.0, metadata-1.8.0
collected 2 items                                                                                                                                                      

test_11.py::test_success ('Value is ', <module 'os' from '/usr/lib/python2.7/os.pyc'>)
PASSED
test_11.py::test_fail ('Value is ', None)
PASSED

======================================================================= 2 passed in 0.07 seconds =======================================================================
$ cat test_11.py 
import utility
import mock



def test_success():
    print("Value is ", utility.os)



@mock.patch("utility.os", return_value = None)
def test_fail(mock_os):
    print("Value is ", utility.os.return_value)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58630145

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档