4

私は py.test を使用しており、オブジェクトをテスト関数に挿入する funcarg アプローチが本当に気に入っています。私のテストでは、多くの外部依存関係があるため、モック オブジェクトを使用する必要があります。特定の属性をモック オブジェクトに置き換えるには、monkeypatch を使用します。

私が抱えている問題は、特定のファンカーグを使用し、常に同じ属性にパッチを適用する必要がある一連のテストで終わることが多いということです。これまでのところ、すべてのテスト関数の属性を置き換えました。

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]])
4

2 に答える 2

5

ドキュメント化された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
于 2011-05-16T21:39:39.067 に答える