Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pytest monkeypatch multiple argv arguments? [closed]

I'm only able to test one argument e.g. animal. Every other added argument fails e.g. name. What must I change?

pytest foo.py returns 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
like image 665
jjk Avatar asked Feb 27 '26 09:02

jjk


1 Answers

According to @MrBean Bremen and with a small edit from @Ouss:

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

Fixed code

### 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
like image 81
Constantin Hong Avatar answered Mar 02 '26 15:03

Constantin Hong



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!