«Объект функции не имеет атрибута conn» при тестировании Streamlit с помощью обезьяньего патчаPython

Программы на Python
Ответить
Anonymous
 «Объект функции не имеет атрибута conn» при тестировании Streamlit с помощью обезьяньего патча

Сообщение Anonymous »

Пожалуйста, простите за эту громкую настройку, пытаясь точно отобразить мою проблему. Я пишу несколько тестов для своего приложения с потоковым освещением, и до сих пор оно работало хорошо, используя стандартный pytest и имитируя мои запросы Postgres с помощью Monkeypatch. Однако сейчас я пытаюсь восстановить данные из запроса INSERT... RETURNING...;, и у меня большие проблемы с корректной областью действия моего макета.
Представьте, что у меня есть следующие настройки приложения:

Код: Выделить всё

.
├── poetry.lock
├── pyproject.toml
└── streamlit
├── app.py
├── classes
│   ├── __init__.py
│   └── burg.py
└── tests
├── __init__.py
└── test_app.py
Где мое основное приложение находится в app.py, а у меня есть класс, выполняющий подъем в классах/burg.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
app.py

Код: Выделить всё

import streamlit as st
from classes.burg import Burger

st.session_state.conn = st.connection("postgres")  # init psql connection

Burger.flip_burger()
test_app.py

Код: Выделить всё

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'
У меня такое ощущение, что я просто неправильно определяю область действия или разрабатываю замену session_state. Как правильно было бы высмеять это с помощью Monkeypatch?

Подробнее здесь: https://stackoverflow.com/questions/792 ... monkeypatc
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»