这是我的代码,工作正常。我在Flask中使用unittest。我不想在每种方法中反复重复相同的代码。
def setUp(self):
self.ctx = app.app_context()
def test_check_data_cleanup_functionality(self):
with self.ctx:
g.db_client = main_client["some_text"]
test_json["stray"] = "abc"
view = View.objects.get(name="test_document")
all_fields = get_all_fields(DocumentDefinition.objects.get(name="test_document"))
status = sanity_check(test_json, view, all_fields, old_collection=None, parent_field_id="")
self.assertFalse(status[0]["error"])
但是,对于每种方法,我都不想输入相同的代码,
with self.ctx:
g.db_client = main_client["some_text"]
我该如何解决?我尝试创建装饰器但由于某种原因我无法获得正确的语法或逻辑。我尝试了各种教程,但我无法这样做。帮忙。我的装饰代码如下。
def timing_function(some_function):
def wrapper(some_function_):
with app.app_context():
g.db_client = main_client["some_text"]
some_function()
return wrapper
@timing_function
def test_check_unique(self):
test_json["single_line_field"] = "Hello!"
view = View.objects.get(name="test_document")
all_fields = get_all_fields(DocumentDefinition.objects.get(name="test_document"))
status = sanity_check(test_json, view, all_fields, old_collection=None, parent_field_id="")
self.assertTrue(status[0]["error"])
答案 0 :(得分:1)
这适用于简单的装饰者:
def timing_function(func):
def wrapper(*args, **kwargs):
with app.app_context():
g.db_client = main_client["ondotfreight"]
func(*args, **kwargs)
return wrapper
装饰器接受func
并返回应该替换它的任何东西。为了使其尽可能通用,内部(替换)函数采用*args
和**kwargs
,但这可以是专门的。
它使用像g
和app
这样的全局变量,这使得装饰器非常依赖于它内部使用的环境,但如果没有装饰器的代码有效,那么这应该是,太
假设您想要向装饰器添加参数,例如传递进入main_client
的键,它将如下所示:
def timing_function(main_client_name)
def wrapper_gen(func):
def wrapper(*args, **kwargs):
with app.app_context():
g.db_client = main_client[main_client_name]
func(*args, **kwargs)
return wrapper
return wrapper_gen
这里首先从参数创建一个装饰器,然后将此装饰器应用于该函数,就像在没有参数的正常情况下一样。有了这个,你可以这样做:
@timing_function("ondotfreight")
def test_check_unique(self):
# ...