Как издеваться над гибридным свойством модели sqlalchemy? - PullRequest
0 голосов
/ 26 февраля 2020

У меня есть таблица:

class A(Base):
    id = Column(Integer, primary_key=True, autoincrement=True)
    age = Column(Integer)

    @hybrid_property
    def is_adult(self):
        if self.age > 18:
            return True
        return False

Использование таблицы:

def check_adult():
    this_user = A.query.first()
    is_adult = this_user.is_adult
    if this_user.is_adult:
        return "Yes"
    else:
        return "No"

Теперь, чтобы написать модульный тест для этого куска кода, я не могу найти способ высмеивать значение is_adult.

@patch("A")
def test_check_adult(mock_A):
    this_user = mock_A.return_value.query.return_value.first.return_value
    this_user.is_adult = True
    assert check_adult() == "Yes"

Пожалуйста, укажите способ издевательства над гибридным_свойством и гибридным_методом.

1 Ответ

1 голос
/ 26 февраля 2020

mock_A.return_value будет издеваться A(), но вы не звоните A, а получаете доступ к его атрибуту A.query et c., Поэтому

this_user = mock_A.query.first.return_value

В сторону использование логического выражения в операторе if и возврат True или False немного избыточны. Просто используйте само логическое выражение:

class A(Base):
    id = Column(Integer, primary_key=True, autoincrement=True)
    age = Column(Integer)

    @hybrid_property
    def is_adult(self):
        return self.age > 18

Это дает дополнительное преимущество работы непосредственно в контексте запроса, поэтому вам не нужно указывать @is_adult.expression отдельно.

...