添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
买醉的伏特加  ·  【Mongoose 7.x ...·  1 周前    · 
仗义的伏特加  ·  java.lang.NoClassDefFo ...·  3 周前    · 
严肃的松树  ·  GridData_为什么scipy.inte ...·  1 年前    · 
Collectives™ on Stack Overflow

Find centralized, trusted content and collaborate around the technologies you use most.

Learn more about Collectives

Teams

Q&A for work

Connect and share knowledge within a single location that is structured and easy to search.

Learn more about Teams
  • create a connection to a database once ,
  • pass this connection around to test which insert data
  • pass the connection to a test which verifies the data.
  • Changing the scope of @pytest.fixture(scope="module") causes ScopeMismatch: You tried to access the 'function' scoped fixture 'event_loop' with a 'module' scoped request object, involved factories .

    Also, the test_insert and test_find coroutine do not need the event_loop argument because the loop is accessible already by passing the connection.

    Any ideas how to fix those two issues?

    import pytest
    @pytest.fixture(scope="function")  # <-- want this to be scope="module"; run once!
    @pytest.mark.asyncio
    async def connection(event_loop):
        """ Expensive function; want to do in the module scope. Only this function needs `event_loop`!
        conn await = make_connection(event_loop)
        return conn
    @pytest.mark.dependency()
    @pytest.mark.asyncio
    async def test_insert(connection, event_loop):  # <-- does not need event_loop arg
        """ Test insert into database.
            NB does not need event_loop argument; just the connection.
        _id = 0
        success = await connection.insert(_id, "data")
        assert success == True
    @pytest.mark.dependency(depends=['test_insert'])
    @pytest.mark.asyncio
    async def test_find(connection, event_loop):  # <-- does not need event_loop arg
        """ Test database find.
            NB does not need event_loop argument; just the connection.
        _id = 0
        data = await connection.find(_id)
        assert data == "data"
                    don't use the default event-loop fixture that they provide, you'll have to make your own and pass it in to your fixture. their default fixture, as stated in the docs is scoped for functions so you won't be able to use it in a module fixture like you want
    – gold_cy
                    May 21, 2019 at 10:59
    

    The solution is to redefine the event_loop fixture with the module scope. Include that in the test file.

    @pytest.fixture(scope="module")
    def event_loop():
        loop = asyncio.get_event_loop()
        yield loop
        loop.close()
                    Also it is better to have scope=session. You will be able to use event_loop in other session-scoped fixtures. There are no reasons to have separate loop for each module.
    – sanyassh
                    May 22, 2019 at 12:21
                    That’s for pointing that out, will be useful in some cases. However here get_event_loop is returning the default loop for the thread, so it’s not a problem to have that in the module scope (or function scope for that matter!)
    – Daniel Farrell
                    May 22, 2019 at 15:05
    

    Similar ScopeMismatch issue was raised in github for pytest-asyncio (link). The solution (below) works for me:

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

    Thanks for contributing an answer to Stack Overflow!

    • Please be sure to answer the question. Provide details and share your research!

    But avoid

    • Asking for help, clarification, or responding to other answers.
    • Making statements based on opinion; back them up with references or personal experience.

    To learn more, see our tips on writing great answers.