насмешливые объекты в декораторе при использовании pytest - PullRequest
1 голос
/ 16 апреля 2020

В приведенном ниже примере у меня есть декоратор. В декораторе я создаю экземпляр класса соединения с БД. У меня есть тестовый класс ниже, где я хочу смоделировать класс соединения с БД внутри декоратора. Как я могу это сделать?

# importing libraries 
import time 
import math 

# decorator to calculate duration 
# taken by any function. 
def calculate_time(func): 

    # added arguments inside the inner1, 
    # if function takes any arguments, 
    # can be added like this. 
    def inner1(*args, **kwargs): 

        db_conn = DBConn()
        # storing time before function execution 
        begin = time.time() 

        func(*args, **kwargs) 

        # storing time after function execution 
        end = time.time() 
        db_conn.logTime(begin, end)
        print("Total time taken in : ", func.__name__, end - begin) 

    return inner1 



# this can be added to any function present, 
# in this case to calculate a factorial 
@calculate_time
def test_factorial(num): 

    # sleep 2 seconds because it takes very less time 
    # so that you can see the actual difference 
    time.sleep(2) 
    print(math.factorial(num)) 

# calling the function. 
factorial(10) 

1 Ответ

0 голосов
/ 17 апреля 2020

Хорошо, чтобы прояснить ситуацию:
При условии, что ваши модули живут в пакете mypackage, а ваш модуль calculate_time.py с декоратором выглядит так:

from mypackage.dbconn import DBConn

def calculate_time(func):
    def inner1(*args, **kwargs):
        ...

И у вас есть модуль factorial.py с:

from mypackage.calculate_time import calculate_time

@calculate_time
def factorial(num):
    time.sleep(2)
    print(math.factorial(num))

Тогда ваш тест может выглядеть так:

from unittest.mock import patch    
from mypackage.factorial import factorial

class FakeConn:
    def logTime(self, begin, end):
        print(begin, end)

@patch('mypackage.calculate_time.DBConn', new=FakeConn)
def test_factorial():
    print(factorial(10))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...