对Flask应用程序类进行单元测试

7
我对Python还比较新,如果这是一些基础内容,那么请提前谅解。
我有一个类似于如何为测试设置带有SQLAlchemy的Flask应用程序?的情况。对我来说最大的区别是,与我在互联网上看到的大多数其他Flask示例不同,我应用程序中的大部分代码都在一个类中。由于某种原因,这导致我的单元测试无法正常工作。以下是我的应用程序和测试的基本设置:
from Flask import Flask

app = Flask(__name__)

class MyApplication():
    def __init__(self, param1, param2):
        app.add_url("/path/<methodParam>", "method1", self.method1, methods=["POST"])
        # Initialize the app

    def getApplication(self):
       options = # application configuration options
       middleware = ApplicationMiddleware(app, options)
       return middleware

    def method1(self, methodParam):
        # Does useful stuff that should be tested
    # More methods, etc.

应用测试:

import unittest
from apppackage import MyApplication

class ApplicationTestCase(unittest.TestCase):

    def setUp(self):
        self.tearDown()
        param1 = # Param values
        param2 = # Param values
        # Other local setup 
        self.app = MyApplication(param1, param2).app.test_client()

    def tearDown(self):
       # Clean up tests

    def test_method1(self):
        methodParam = # Param value
        response = self.app.post("path/methodParam")
        assert(reponse.status_code == 200)

当我通过以下方式运行我的测试时:
``` nosetests --with-coverage --cover-package apppackage ./test/test_application.py ```
我收到以下错误信息:
``` param2).app.test_client() AttributeError: MyApplication instance has no attribute 'app' ```
我尝试将 "app" 移动到类声明内部,但这没有任何好处,并且不是我看到的其他单元测试指南的做法。为什么我的单元测试无法找到 "app" 属性?

1
正如Mark在他的回答中提到的那样,类中没有app属性。除非我们使用self.attribute_name=value将其附加到类或在类内部方法之前定义它,否则属性不属于类而存在。 - codecool
1个回答

4

你的单元测试无法找到"app"属性,因为MyApplication没有这个属性。在定义MyApplication的模块中有一个"app"属性。但是它们是两个不同的位置。

也许可以尝试以下方法:

class MyApplication(object):
    def __init__(self, param1, param2):
        self.app = Flask(__name__)
        self.app.add_url("/path/<methodParam>", "method1", self.method1, methods=["POST"])
        # Initialize the app

另外,您似乎还有一个“getApplication”方法,但实际上您没有对它进行任何操作,但我想您可能正在使用它进行某些操作。也许您实际上希望在测试中使用它...

def setUp(self):
        self.tearDown()
        param1 = # Param values
        param2 = # Param values
        # Other local setup 
        self.app = MyApplication(param1, param2).getApplication().test_client()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接