Могу ли я исправить метод объекта с помощью декоратора - PullRequest
0 голосов
/ 06 марта 2019

Вызов: исправление / насмешка вызова метода в удаленном классе для возврата известного фрагмента данных.

У меня есть целая серия тестов, которые выглядят так:

@pytest.mark.gen_test
def test_assignment5(app):
    with patch.object(BaseHandler, 'get_current_user') as mock_user:
        mock_user.return_value = {"name": '1_kiz'}
        with patch.object(BaseHandler, 'get_auth_state') as mock_state:
            mock_state.return_value = { "course_id": "course_2",
                                        "course_role": "Instructor",
                                        "course_title": "A title",
                                    }
            r = yield async_requests.get(app.url + "/assignment?course_id=course_2&assignment_id=assign_a")
    assert r.status_code == 200
    response_data = r.json()   
    assert response_data["success"] == False
    assert response_data["note"] == "Assignment assign_a does not exist"   

(app - основной метод для моего приложения, а get_current_user & get_auth_state используют информацию, выходящую за рамки приложения, чтобы получить значение, поэтому необходимо fudged )

..... повторяющиеся with сегменты оскорбляют мое восприятие красивого кода.

Я знаю, что мог бы перевести словари возвращаемых значений в переменные верхнего уровня, и это уменьшило бы некоторый повторяющегося кода, однако я все еще повторяю вещи with patch.object каждый раз.

Чтение https://docs.python.org/dev/library/unittest.mock.html#unittest.mock.patch Я знаю, что могу просто украсить каждый тест, однако

user_kiz = { ... }
auth_inst = { ... }

....

@pytest.mark.gen_test
@patch('BaseHandler.get_current_user', return_value = user_kiz)
@patch('BaseHandler.get_auth_state', return_value = auth_inst)
def test_assignment5a(app, kiz):
    r = yield async_requests.get(app.url + "/assignment?course_id=course_2&assignment_id=assign_a")
    assert r.status_code == 200
    response_data = r.json()   
    assert response_data["success"] == False
    assert response_data["note"] == "Assignment assign_a does not exist"

просто дает мне ModuleNotFoundError: No module named 'BaseHandler' ошибку.

Есть ли в способ исправить / смоделировать вызов метода в удаленном классе, позволяя мне устанавливать словари current_user & auth_state для каждого вызова?

(в конечном итоге мне также нужно будет протестировать для разных пользователей и разных auth_states)

1 Ответ

0 голосов
/ 09 марта 2019

Чтобы заменить звонок следующим образом:

with patch.object(a, 'b', c):

с декоратором, вы бы использовали:

@patch.object(a, 'b', c)

Вы перешли на строковую форму

@patch(..., ...)

В строковой форме в качестве первого аргумента требуется полный путь импорта

...