我使用 py.test 并且非常喜欢将对象注入(inject)测试函数的 funcarg 方法。 在我的测试中,我需要使用 Mock 对象,因为我有很多外部依赖项。我使用 monkeypatch 将某些属性替换为模拟对象。
我遇到的问题是,我经常会以一堆测试结束,这些测试将使用特定的 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
关于python - py.test 在自定义 funcargs 中使用 monkeypatch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6018040/