微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – py.test在自定义函数中使用monkeypatch

我使用py.test并且非常喜欢将对象注入测试函数的funcarg方法.
在我的测试中,我需要使用Mock对象,因为我有很多外部依赖项.我使用monkeypatch用mock对象替换某些属性.

我遇到的问题是,我经常会得到一堆测试,这些测试将使用某个funcarg并且总是需要修补相同的属性.到目前为止,我替换了每个测试函数中的属性.

有没有办法在我的funcarg函数中使用monkeypatch,并从单个测试中删除这个重复的代码

import sys
import pytest
from mock import Mock


#----------------------------------------------------------------------
def pytest_funcarg__api(request):
    """"""
    api = myclass()
    #do some initialisation...
    return api


#----------------------------------------------------------------------
def test_bla1(monkeypatch, api):
    """"""
    monkeypatch.setattr(api,"get_external_stuff",Mock())
    monkeypatch.setattr(api,"morestuff",Mock())

    api.do_something1()
    assert not api.a

#----------------------------------------------------------------------
def test_bla2(monkeypatch, api):
    """"""
    monkeypatch.setattr(api,"get_external_stuff",Mock())
    monkeypatch.setattr(api,"morestuff",Mock())

    api.do_something2()
    assert api.b


if __name__=='__main__':
    pytest.main(args=["-v",sys.argv[0]])

解决方法:

您可以使用记录的getfuncargvalue函数在内部使用来自另一个函数参数的工厂的函数参数:

def pytest_funcarg__api(request):
    api = myclass()
    #do some initialisation...
    mp = request.getfuncargvalue("monkeypatch")
    mp.setattr(api,"get_external_stuff", Mock())
    mp.setattr(api,"morestuff", Mock())
    return api

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐