Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 30, 2019 13:42:07

Pit
Зарегистрирован: 2018-12-26
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Как замокать функцию?

Есть в файле метод

 db = DataBase()
def some_func(db, text):
    list = обращение к базе
    return list

и надо замокать метод some_func?

Офлайн

#2 Янв. 30, 2019 14:01:48

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Как замокать функцию?

Ну в вышеуказанном куске кода some_func это не метод, а функция.
Замокать можно используя модуль unittest.mock , там есть и patch и сам Mock, вполне хватает примеров.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#3 Янв. 31, 2019 07:49:30

Pit
Зарегистрирован: 2018-12-26
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Как замокать функцию?

JOHN_16
Ну в вышеуказанном куске кода some_func это не метод, а функция.Замокать можно используя модуль unittest.mock , там есть и patch и сам Mock, вполне хватает примеров.
Да,примеров много, но как то не работает!!! С классами писал и все ок, но вот функцию замокать не получается.
Вот пример функций, все просто:
 from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.orm import Session
from services.DAL.batabase import DataBase
from sqlalchemy.sql import update
class Message:
    def __init__(self):
        self.id = None
        self.text = None
LIMIT = 100
def get_list_messages(db):
    session = Session(db.engine)
    try:
        list_messages = session.query(db.message).limit(LIMIT).all()
    except SQLAlchemyError:
        raise
    finally:
        session.close()
    return list_messages
def update_message(db, message):
    session = Session(db.engine)
    try:
        statement = update(db.message).values(text=message.text).where(db.message.id == message.id)
        session.execute(statement)
        session.commit()
    except SQLAlchemyError:
        session.rollback()
    finally:
        session.close()
def run_check(db):
    try:
        list_messages = get_list_messages(db)
        if list_messages:
            for message in list_messages:
                message.text = "DELETE"
                update_message(db, message)
    except Exception as e:
            print(str(e))
db = DataBase()
run_check(db)

И вот пытаюсь замокать функцию:

 from unittest.mock import patch
from unittest.mock import Mock
from unittest.mock import MagicMock
from temp_for_mock import Message, get_list_messages, update_message, run_check
from services.DAL.batabase import DataBase
def create_message(id, text):
    message = Message()
    message.id = id
    message.text = text
    return message
message1 = create_message(1, "message1")
message2 = create_message(2, "message2")
list_messages = [message1, message2]
db = Mock()
with patch('temp_for_mock.get_list_messages') as mock_get_list:
    mock_get_list.return_value = list_messages
list = get_list_messages(db)
print(list)

И вот как минимум сам метод get_list_messages выполняется и закономерная ошибка:
for c in column._select_iterable:
TypeError: ‘Mock’ object is not iterable

Может что то не до понимаю?

Отредактировано Pit (Янв. 31, 2019 07:50:47)

Офлайн

#4 Янв. 31, 2019 08:48:25

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10022
Репутация: +  857  -
Профиль   Отправить e-mail  

Как замокать функцию?

Вот пара примеров по перекрытию встроенных функций
пример1
пример2



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version