sor*_*rin 3 python testing mocking pytest python-decorators
我一直在尝试找到一种同时使用模拟装饰器和 pytest capsys 的方法,但我找不到正确的方法来做到这一点。
import pytest
import requests_mock
@requests_mock.mock()
def test_with_mock(m):
    pass
def test_with_capsys(capsys):
    pass
# how to write a test that works with both?
pytest有自己的注册和加载自定义装置的方法。requests-mock提供一个注册的外部设备pytest,只需将其指定为参数即可使用。无需导入requests-mock,只需安装并指定参数即可requests_mock。该装置然后提供与
requests_mock.Mocker让您requests-mock按预期使用相同的界面。Run Code Online (Sandbox Code Playgroud)>>> import pytest >>> import requests >>> def test_url(requests_mock): ... requests_mock.get('http://test.com', text='data') ... assert 'data' == requests.get('http://test.com').text ...
所以只需使用requests_mock夹具而不是装饰器:
def test_with_mock_and_capsys(requests_mock, capsys):
    pass
pytest不与向测试函数添加位置参数的函数装饰器一起使用。pytest考虑所有的论点
functools.partial;unittest.mock模拟替换将替换为夹具值,如果没有为任何参数找到合适的夹具,则会失败。所以像
import functools
import pytest
def deco(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        args += ('spam',)
        return func(*args, **kwargs)
    return wrapper
@deco
def test_spam(spam_arg):
    assert True
会失败,而这正是requests-mock它的作用。一种解决方法是通过关键字 args 传递 mocker:
import pytest
import requests_mock
@requests_mock.Mocker(kw='m')
def test_with_mock_and_fixtures(capsys, **kwargs):
    m = kwargs['m']
    ...
但是既然requests-mock已经提供了一个装置,为什么还要使用装饰器呢?
| 归档时间: | 
 | 
| 查看次数: | 1506 次 | 
| 最近记录: |