【发布时间】:2017-10-28 01:08:35
【问题描述】:
所以我想测试一个装饰器,它可以为您提供一个已启动的协程(所以我不必这样做 coroutine.send(None) )。
详情请见here。大卫比兹利的例子)
所以在 conftest.py 中,我创建了一个函数包装器,它是一个 pytest 固定装置,如果有意义的话,它会为我提供一个原始协程。
我这样做的原因是因为 pytest 会将 yield 关键字之后的任何内容作为拆卸代码,而我不希望这样。所以我自己封装了一个原始协程。
@pytest.fixture(scope="module")
def create_coroutine_func():
def grep(pattern):
print "Looking for %s" % pattern
while True:
line = (yield)
if pattern in line:
print line
return grep
现在在我的测试文件中,我有一个相当简单的测试:
from something.decorators import *
import pytest
1 def test_coroutine(create_coroutine_func):
2 coro_func = create_coroutine_func()
3 coro_wrapper = coroutine(coro_func)
4
5 assert callable(coro_wrapper)
好的,就是这样。 pytest 抱怨:
create_coroutine() 缺少 1 个必需的位置参数:'pattern'
然后我继续编辑第 2 行:
coro_func = create_coroutine_func("python") # match anything has 'python' in it.
现在测试通过了。
现在我对装饰器有点困惑。
所以在我的例子中 grep 接受一个参数;当我调用我的 grep 函数包装器时,我还需要给函数包装器一个参数,尽管它本身不接受任何参数?这就是装饰器的工作原理吗?
【问题讨论】:
-
我 认为 pytest 固定装置在这里可能会造成混淆。当您将夹具作为参数传递给测试函数时,return 值就是参数。所以在你的情况下第 2 行
create_coroutine_func is grep. -
@JacquesKvam 我可能错了,当我通过测试时,你的意思是“create_coroutine_func”是“grep”吗?我认为‘create_coroutine_func’的返回值会是‘grep’,不是吗?当你说返回值是参数时,这里的参数是什么?
-
create_coroutine_func(无括号)是grep,因为pytest在将其转换为夹具时调用了create_coroutine_func()(注意:括号)。 -
@phd 好的,我想我明白你的意思了。谢谢您的帮助!首先这有点令人困惑。
-
@JacquesKvam 谢谢我现在明白你的意思了。
标签: python decorator pytest coroutine