Pytests: getting error function uses no argument error

3.3k Views Asked by At

I have following code:

@pytest.fixture
def mock_path_functions(mocker, file_exists=True, file_size=10):
    mock_obj = mock.Mock()
    mock_obj.st_size = file_size
    mocker.patch("os.path.exists", return_value=file_exists)
    mocker.patch("os.stat", return_value=mock_obj)
 
@pytest.mark.usefixtures("mock_path_functions")
@ytest.mark.parametrize("file_exists,file_size", [(False, 0)])
def test_subscrition_handle_from_file_when_file_is_not_present():
    assert subscrition_handle_from_file("some path") == None

However I'm getting following error:

In test_subscrition_handle_from_file_when_file_is_not_present: function uses no argument 'file_exists'

How I can specify parameters to mock_path_function()?

2

There are 2 best solutions below

0
On

I think you just need to pass your arguments into your test function, like

@pytest.mark.usefixtures("mock_path_functions")
@ytest.mark.parametrize("file_exists,file_size", [(False, 0)])
def test_subscrition_handle_from_file_when_file_is_not_present(
    file_exists, file_size
):
    assert subscrition_handle_from_file("some path") == None
0
On

I got the same error below with pytest-django and pytest-factoryboy in Django:

Failed: In test_user_instance: function uses no argument 'email'

Because I did not put email argument to test_user_instance() even though I set email to @pytest.mark.parametrize() as shown below:

import pytest
from django.contrib.auth.models import User

@pytest.mark.parametrize(
    "username, email", # Here
    [
        ("John", "[email protected]"),
        ("David", "[email protected]")
    ]
)
def test_user_instance(
    db, user_factory, username, # email # Here
):
    user_factory(
        username=username,
        # email=email
    )

    item = User.objects.all().count()
    assert item == True

So, I put email argument to test_user_instance() as shown below, then the error was solved:

import pytest
from django.contrib.auth.models import User

@pytest.mark.parametrize(
    "username, email",
    [
        ("John", "[email protected]"),
        ("David", "[email protected]")
    ]
)
def test_user_instance(
    db, user_factory, username, email # Here
):
    user_factory(
        username=username,
        email=email
    )

    item = User.objects.all().count()
    assert item == True