2

对于我编写的使用我的应用程序模型的每个测试,我似乎都必须使用当前的应用程序上下文:

SomeTestCase(unittest2.TestCase):

    setUp(self):
        self.app = Flask(__name__)
        ...

    test_something(self):
        with self.app.app_context():
            # Do something

有没有办法告诉我所有的测试使用当前的应用程序上下文运行,以节省我在所有测试中都使用这条线?

4

3 回答 3

4

我通过查看Flask-Testing 扩展 TestCase 设置自己的方式找到了我正在寻找的答案,即将测试上下文推送到从其方法_ctx中调用的函数内的堆栈中__call__

class BaseTestCase(unittest2.TestCase):

    def __call__(self, result=None):
        try:
            self._pre_setup()
            super(BaseTestCase, self).__call__(result)
        finally:
            self._post_teardown()

    def _pre_setup(self):
        self.app = create_app()
        self.client = self.app.test_client()
        self._ctx = self.app.test_request_context()
        self._ctx.push()

    def _post_teardown(self):
        if getattr(self, '_ctx') and self._ctx is not None:
            self._ctx.pop()
        del self._ctx

我的测试:

class SomeTestCase(BaseTestCase):

    test_something(self):
        # Test something - we're using the right app context here
于 2013-09-04T14:30:02.047 回答
2

您可以尝试以下方法。

免责声明:我只是想出了这个想法,并没有彻底测试这个解决方案,尽管它似乎有效。恕我直言,这也很丑陋。

from functools import wraps

def with_context(test):
    @wraps(test)
    def _with_context(self):
        with self.app.app_context():
            test(self)
    return _with_context


SomeTestCase(unittest2.TestCase):

    setUp(self):
        self.app = Flask(__name__)
        ...

    @with_context
    test_something(self):
        # Do something
于 2013-09-02T21:51:19.520 回答
1

根据您的测试方式,您可能能够使用测试客户端。例子:

SomeTestCase(unittest2.TestCase):

    setUp(self):
        self.app = Flask(__name__)
        self.client = self.app.text_client()

    test_something(self):
        response = self.client.get('/something')
        # check response
于 2013-09-02T02:27:32.173 回答