如何对 monkeypatch 多个 argv 参数进行 pytest?

How to pytest monkeypatch multiple argv arguments?

提问人:jjk 提问时间:7/31/2022 更新时间:9/9/2023 访问量:709

问:

我只能测试一个参数,例如动物。所有其他添加的参数都失败,例如名称。我必须更改什么?

pytest foo.py返回pytest: error: the following arguments are required: name

### foo.py ###
import argparse
import pytest
import sys

@pytest.mark.parametrize('animal_input', ['cat'])
@pytest.mark.parametrize('name_input', ['tom'])
def test_get_bake_progress(monkeypatch, animal_input, name_input):
    with monkeypatch.context() as m:
        m.setattr(sys, 'argv', ['--animal', animal_input])
        m.setattr(sys, 'argv', ['--name', name_input])
        assert foo() == (animal_input)


def foo():
    parser = argparse.ArgumentParser()
    parser.add_argument('animal')
    parser.add_argument('name')
    args = parser.parse_args()
    animal = args.animal
    name = args.name
    return animal
pytest monkeypatching

评论

2赞 MrBean Bremen 7/31/2022
您将替换为第二个参数,而不是添加另一个参数。您必须一次拥有所有属性。sys.argvsetattrsetattr

答:

1赞 Constantin Hong 5/12/2023 #1

根据 @MrBean Bremen 的说法,并进行了 @Ouss 的一个小编辑:

m.setattr(sys, 'argv', [ sys.argv[0], '--animal', animal_input, '--name', name_input])

固定代码

### foo.py ###
import argparse
import pytest
import sys

@pytest.mark.parametrize('animal_input', ['cat'])
@pytest.mark.parametrize('name_input', ['tom'])
def test_get_bake_progress(monkeypatch, animal_input, name_input):
    with monkeypatch.context() as m:
        m.setattr(sys, 'argv', [ sys.argv[0], '--animal', animal_input, '--name', name_input])
        assert foo() == (animal_input)


def foo():
    parser = argparse.ArgumentParser()
    parser.add_argument('animal')
    parser.add_argument('name')
    args = parser.parse_args()
    animal = args.animal
    name = args.name
    return animal