Представьте, что у меня есть следующие настройки приложения:
Код: Выделить всё
.
├── poetry.lock
├── pyproject.toml
└── streamlit
├── app.py
├── classes
│ ├── __init__.py
│ └── burg.py
└── tests
├── __init__.py
└── test_app.py
burg.py
Код: Выделить всё
import streamlit as st
from sqlalchemy.sql import text
class Burg:
pass
class Burger(Burg):
@staticmethod
def flip_burger() -> list[str]:
with st.session_state.conn.session as session:
new_antigens = session.execute(
text(
"INSERT INTO user_logs (update_time, antigens_id, users_id, "
"site_page, status_changed) VALUES ('2024-10-10 00:00:00', 1, 1, "
"'burgers', 'flipped') returning user_logs_id;"
)
)
session.commit()
new_ids = [str(new_id[0]) for new_id in new_antigens]
return new_ids
Код: Выделить всё
import streamlit as st
from classes.burg import Burger
st.session_state.conn = st.connection("postgres") # init psql connection
Burger.flip_burger()
Код: Выделить всё
import streamlit as st
import pandas as pd
from classes.burg import Burger
class Test_Burger:
def test_flip_burger(self, monkeypatch):
class session_state:
class conn:
class session:
def __enter__(self):
return self
def __exit__(self):
pass
@staticmethod
def execute(null):
return pd.DataFrame({"ids": [100]})
def mock_conn(*args, **kwargs):
return session_state()
monkeypatch.setattr(st, "session_state", mock_conn)
borger = Burger()
assert borger.flip_burger() == [100]
Я хотел бы используйте приведенный выше метод Monkeypatched, чтобы имитировать st.session_state.conn.session и .execute(), чтобы я мог вернуть пару поддельных идентификаторов и протестировать свою функцию.
Я попробовал несколько разных итераций макетного класса session_state (из https://docs.pytest.org/en/stable/how-t ... patch.html), но самое близкое, что я могу получить, это :
Код: Выделить всё
FAILED tests/test_app.py::Test_Burger::test_flip_burger - AttributeError: 'function' object has no attribute 'conn'
Подробнее здесь: https://stackoverflow.com/questions/792 ... monkeypatc
Мобильная версия