我在尝试向 Flask 应用程序编写测试时迷失了方向

jwa*_*lof 5 python testing webtest flask python-unittest

因此,我尝试为我的 Flask 应用程序编写一些测试几天,但我无法让它运行。测试通过了,但卡在“通过”上。

我克隆了 cookiecutter-flask (cookiecutter-flask),它与 pytest 一起运行 webtest (我认为)。我的conftest.py看起来与存储库 ( conftest.py )中的相同

这些是我当前的测试:

def test_app(testapp):
    app = create_app(TestConfig)
    res = testapp.get('/')
    res.status_code == 200
Run Code Online (Sandbox Code Playgroud)

这过去了,而且还在继续。

def test_create_admin_user(db, testapp):
    password = bcrypt.generate_password_hash('test')

    User.create(
        uid='00000000000000000000',
        email='john@doe.com',
        password=password,
        active=1
    )

    user = User.query.filter_by(email='j@d.com').first()

    assert user.email == 'j@d.com'
Run Code Online (Sandbox Code Playgroud)

这就是我迷失的地方,测试卡在“通过”并且没有做任何事情。当我强制中断进程时,我得到以下信息:

Traceback (most recent call last):
  File "manage.py", line 68, in <module>
    manager.run()
  File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask_script/__init__.py", line 412, in run
    result = self.handle(sys.argv[0], sys.argv[1:])
  File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask_script/__init__.py", line 383, in handle
    res = handle(*args, **config)
  File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask_script/commands.py", line 216, in __call__
    return self.run(*args, **kwargs)
  File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask/ctx.py", line 386, in __exit__
    self.auto_pop(exc_value)
  File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask/ctx.py", line 374, in auto_pop
    self.pop(exc)
  File "/home/johan/Development/venv_python/local/lib/python2.7/site-packages/flask/ctx.py", line 357, in pop
    % (rv, self)
AssertionError: Popped wrong request context.  (<RequestContext 'http://localhost/' [GET] of backend.app> instead of <RequestContext 'http://localhost/' [GET] of backend.app>)
Run Code Online (Sandbox Code Playgroud)

我在 Flask 中找到了关于测试的以下线程(当然,这是 Flask-Testing 但我认为它有一些相关性,也许没有:问题)并更改了我的测试配置,使其包含PRESERVE_CONTEXT_ON_EXCEPTION = False但它仍然只是挂起。

有人有什么想法我可以尝试吗?我对测试本身不太熟悉,所以这可能是我做错了。

Leo*_*eoG 0

您需要使用正确的应用程序上下文

 def test_create_admin_user(db, testapp):
    with app.app_context():
      password = bcrypt.generate_password_hash('test')
      User.create(
            uid='00000000000000000000',
            email='john@doe.com',
            password=password,
            active=1
        )

      user = User.query.filter_by(email='j@d.com').first()
      assert user.email == 'j@d.com'
Run Code Online (Sandbox Code Playgroud)

有关完整示例,请参阅https://github.com/Leo-G/Flask-Scaffold/blob/master/scaffold/app/tests.py