【问题标题】:How to return multiple value from a pytest fixture with scope = session如何从范围=会话的pytest夹具返回多个值
【发布时间】:2022-01-21 22:48:47
【问题描述】:

我在 conftest.py 中创建了 pytest 夹具,用于创建用户和自动登录

@pytest.fixture(scope="session")
def api_client():
   from rest_framework.test import APIClient
   return APIClient()

@pytest.fixture(scope="session")
@pytest.mark.django_db
def create_user():
    def make_user(**kwargs):
        # employee = e_ge_employee.objects.create()
        kwargs['password'] = 'strong-test-pass'
        if 'username' not in kwargs:
            kwargs['username'] = 'test-user'
        # if 'employee' not in kwargs:
        #     kwargs['employee'] = employee
        return e_ge_user.objects.create_user(**kwargs)
    return make_user

@pytest.fixture(scope="session")
@pytest.mark.django_db
def auto_login_user(api_client, create_user):
    def make_auto_login():
        print("_+==--=-=-=-===--=-=-==----=-=-=-=")
        user = create_user()
        api_client.login(username=user.username, password='strong-test-pass')
        return api_client, user
    return make_auto_login

现在如何使用 API 客户端调用 get、post 方法以及如何在 test_views.p 中编写的多个测试用例中访问用户

@pytest.mark.django_db
class TestViews:

    def test_generate_token_views_post(self,auto_login_user):
        **"To be Answered"**
        assert True == True

    def test_generate_token_views_post2(self,auto_login_user):
        **"To be Answered"**
        assert True == True

【问题讨论】:

    标签: python django pytest pytest-django django-fixtures


    【解决方案1】:

    您可以在fixture 中调用make_auto_login(),这将执行函数并返回api_clientuser。之后在测试中auto_login_user 将是一个包含值的元组

    conftest.py:

    @pytest.fixture(scope="session")
    @pytest.mark.django_db
    def auto_login_user(api_client, create_user):
        def make_auto_login():
            print("_+==--=-=-=-===--=-=-==----=-=-=-=")
            user = create_user()
            api_client.login(username=user.username, password='strong-test-pass')
            return api_client, user
        return make_auto_login()
    

    test_views.py

    class TestViews:
    
        def test_generate_token_views_post(self, auto_login_user):
            api_client, user = auto_login_user
            assert True
    
        def test_generate_token_views_post2(self, auto_login_user):
            api_client, user = auto_login_user
            assert True
    

    【讨论】:

    • 这个解决方案正在运行,但这个解决方案的问题是每次它调用 auto_login_user 固定装置并且每次都在创建新用户,你能提出一些建议吗?
    • @KritikAlawat 这不会发生在我身上,我无法复制。在当前结构中auto_login_user 应该运行一次。
    • 根据您的解决方案,如果我使用此 api_client, user = auto_login_user 我收到错误 TypeError: 'function' object is not iterable。如果我使用 api_client, user = auto_login_user() 这个 auto_login_user 将永远运行。你能看看这个吗?
    • @KritikAlawat 你可能没有改变auto_login_user 返回return make_auto_login()
    • 对不起,我错过了,但在将其更改为 make_auto_login() 后,它给了我一个 RuntimeError 错误:不允许数据库访问,使用“django_db”标记,或“db”或“transactional_db”固定装置来启用它。我没有改变其他任何东西。你能解释一下为什么会这样吗?
    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    相关资源
    最近更新 更多