小编Rob*_* Pd的帖子

有装饰器的模拟函数。再次使用相同的装饰器来装饰 Mock 对象并保持它是 Mock

在我的装饰器上使用后@patch它不再起作用了。我想要进行一个会失败并引发异常的调用,以便我可以检查我的装饰器是否捕获了此异常,并且正在调用某个函数。
模拟do_sth_in_db并让它引发异常是很容易的部分,但是在模拟这个方法之后,它不再被修饰 - 所以即使它引发异常,也不会发生任何事情,因为它不再有块try/except

TLDR:我想把 @decorator 放回我的模拟函数上。

我的.py

from my_decorator import transaction


class MyClass():

    @transaction
    def do_sth_in_db(self):
        print('Did something in DB')
Run Code Online (Sandbox Code Playgroud)

my_decorator.py

import functools

def rollback_func():
    print('666 rollback fun called')

def push_to_db_func():
    print('777 I have changed database')

def transaction(func):
    functools.wraps(func)
    def wrapper(*args,**kwargs):
        try:
            func(*args, **kwargs)
            push_to_db_func()
            print('worked')
        except Exception:
            rollback_func()
            print('not worked, did rollback')
    return wrapper
Run Code Online (Sandbox Code Playgroud)

测试.py

import unittest

from mock import Mock, patch, MagicMock
from my import MyClass
from my_decorator import transaction

class …
Run Code Online (Sandbox Code Playgroud)

python unit-testing exception mocking python-decorators

6
推荐指数
1
解决办法
1001
查看次数