(pytest) Почему макет свойства не работает в приборе? - PullRequest
0 голосов
/ 28 мая 2019

У меня есть класс с некоторыми свойствами.В моем тесте мне нужно настроить прибор и проверить свойства.Однако патч работает только в функции прибора, а не при его вызове.Любая идея, как это исправить?

Вот упрощенная версия проблемы.Давайте предположим, что это мой класс Panda:

class Panda(object):
    def __init__(self, name):
        self.panda_name = name

    @property
    def name(self):
        return self.panda_name

, и это мой тест

import pytest
from unittest.mock import patch, PropertyMock
from tmp import Panda


@pytest.fixture
@patch(
    'tmp.Panda.name',
    new_callable=PropertyMock,
    return_value="yuanyuan")
def fixture_panda(mk_name):
    p = Panda("this name should not matter")
    print(p.name)  # print "yuanyuan"
    return p


def test_panda_fixture(fixture_panda):
    p = fixture_panda
    print(p.name)  # print "this name should not matter"
    # this test fails
    assert p.name == "yuanyuan"

Первая функция печати в fixture_panda выдаст yuanyuan, что означаетpropertyMock работает как положено.Однако вторая функция печати в test_panda_fixture print this name should not matter, что означает, что propertyMock здесь не работает.Любая идея, почему это происходит и как это исправить?

1 Ответ

1 голос
/ 28 мая 2019

Если вы хотите обезьянить что-то в pytest, вы можете использовать их встроенный прибор monkeypatch, который можно вставить во все приборы с помощью scope = function. Вот пример из моей кодовой базы:

@pytest.fixture(scope="function", autouse=True)
def no_jwt(monkeypatch):
  """Monkeypatch the JWT verification functions for tests"""
  monkeypatch.setattr("flask_jwt_extended.verify_jwt_in_request", lambda: print("Verify"))

Если я применю это к вашему примеру, я думаю, что-то вроде этого должно работать:

@pytest.fixture
def fixture_panda(monkeypatch, mk_name):
  monkeypatch.setattr('tmp.Panda.name', "yuanyuan")
  p = Panda("this name should not matter")
  print(p.name)  # print "yuanyuan"
  return p
...