2012-06-19 22 views
6

我对Python相当陌生,所以如果这对于一些基本的东西来说,我很抱歉。单元测试一个Flask应用程序类

我有类似于How do you set up a Flask application with SQLAlchemy for testing?的情况对我来说,最大的不同在于,与我在互联网上看到的大多数其他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

我ge T,则下面的错误:

param2).app.test_client() AttributeError: MyApplication instance has no attribute 'app'

我已经试过移动类声明里面的应用程序,但这并没有什么好处,而不是每个其他单元测试导游,我已经看到了是怎么做的。为什么我的单元测试找不到“应用程序”属性?

+1

正如马克在他的回答中提到的那样,班上没有应用程序属性。一个属性不属于一个类,除非我们使用self.attribute_name = value附加它,或者在类内部的方法之外定义它。 – codecool

回答

2

您的单元测试找不到“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()