将@ pytest.fixture(scope =“ module”)与@ pytest.mark.asyncio一起使用

时间:2019-05-21 10:47:45

标签: python pytest python-asyncio pytest-asyncio

我认为以下示例是一个非常常见的用例:

  1. 一次创建与数据库的连接
  2. 传递此连接以测试哪些数据插入
  3. 将连接传递给验证数据的测试。

更改bin/elasticsearch -Ecluster.initial_master_nodes=master-a,master-b,master-c 的范围会导致@pytest.fixture(scope="module")

此外,ScopeMismatch: You tried to access the 'function' scoped fixture 'event_loop' with a 'module' scoped request object, involved factoriestest_insert协程不需要event_loop参数,因为通过传递连接已经可以访问该循环。

有什么办法解决这两个问题吗?

test_find

2 个答案:

答案 0 :(得分:0)

解决方案是使用模块范围重新定义event_loop固定装置。将其包含在测试文件中。

@pytest.yield_fixture(scope="module")
def event_loop():
    loop = asyncio.get_event_loop()
    yield loop
    loop.close()

答案 1 :(得分:0)

在github中针对pytest-asyncio(link)提出了类似的ScopeMismatch问题。解决方案(如下)对我有用:

@pytest.yield_fixture(scope='class')
def event_loop(request):
    loop = asyncio.get_event_loop_policy().new_event_loop()
    yield loop
    loop.close()