python - py.test 在自定义 funcargs 中使用 monkeypatch

标签 python unit-testing pytest

我使用 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/

相关文章:

python - Pytest中如何控制增量测试用例

python - python 发送邮件错误

python - XlsxWriter 和 Python 继承

python - 无法安装pyaudio,gcc错误

unit-testing - 使用 Vuex 的 Vue.js-electron 应用程序的设置测试

python - 从 pytest fixture 中产生的调用函数

javascript - 使用 django channel 将 webRTC 视频流发送到服务器

PHPUnit:模拟除某些方法之外的所有方法

javascript - 如何对另一个函数内的函数被调用进行单元测试?

django - 如何创建一个序列化程序来重用我的模型的唯一键?