我有一个单元测试,可以在数据库中加载一些数据进行测试。我为此创建了一个装饰器函数,用于测试用例
class TestCompany(unittest.TestCase):
def setUp(self):
...
self.engine = create_engine(db_url)
Session = sessionmaker(bind=self.engine)
self.session = Session()
@loadfixtures(['employee.json'])
def test_checkdb_employee(self):
c = self.session.query(Employee).count()
self.assertEqual(c , 20)
但是,我需要以某种方式传递self.engine
给装饰器。
@loadfixtures(self.engine, ['employee.json'])
不起作用,因为self
那里没有。
我为此创建了此解决方案,但是有没有更简单(更易读)的解决方案?
def test_checkdb_employee(self):
@loadfixtures(['employee.json'])
def run(engine):
c = self.session.query(Employee).count()
self.assertEqual(c , 20)
return run(self.engine)
#decorator
import pandas as pd
def loadfixtures( files):
def decorator(func):
def wrapped_func(*args, **kwargs):
for file in files:
df = pd.read_json(Path(datafolder).joinpath(file))
df.to_sql(file.split(".")[0], con=args[0],index=False, if_exists='append')
return func(*args, **kwargs)
return wrapped_func
return decorator
(engine
用于中con=args[0]
)
self
实际上是作为的第一个参数传递的test_checkdb_employee
。因此,要访问您engine
的装饰,以用作论据的con
,你可以只是做参数args[0].engine
与args[0]
是self
(在TestCompany
实例)。
def loadfixtures(files):
def decorator(func):
def wrapped_func(*args, **kwargs):
for file in files:
df = pd.read_json(Path(datafolder).joinpath(file))
df.to_sql(file.split(".")[0], con=args[0].engine, index=False, if_exists='append')
return func(*args, **kwargs)
return wrapped_func
return decorator
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句