2012-06-19 10 views
6

Tôi khá mới với Python, vì vậy xin lỗi trước nếu điều này là nhiều ado cho một cái gì đó cơ bản.Đơn vị thử nghiệm một lớp ứng dụng Flask

Tôi có tình huống tương tự như How do you set up a Flask application with SQLAlchemy for testing? Sự khác biệt lớn đối với tôi là không giống như hầu hết các ví dụ Flask khác tôi thấy trên Internet, hầu hết mã tôi có cho ứng dụng của tôi là trong một lớp học. Vì một lý do nào đó, điều này làm cho thử nghiệm đơn vị của tôi hoạt động không chính xác. Dưới đây là một thiết lập cơ bản của ứng dụng của tôi và kiểm tra:

Ứng dụng:

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. 

thử nghiệm ứng dụng:

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) 

Khi tôi chạy thử nghiệm của tôi qua

nosetests --with-coverage --cover-package apppackage ./test/test_application.py

Tôi ge t các lỗi sau:

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

Tôi đã cố gắng di chuyển ứng dụng bên trong khai báo lớp, nhưng điều đó không làm bất kỳ tốt, và không phải là cách mỗi hướng dẫn kiểm tra đơn vị khác mà tôi đã nhìn thấy không nó được. Tại sao các bài kiểm tra đơn vị của tôi không thể tìm thấy thuộc tính "ứng dụng"?

+1

Như Mark đã đề cập trong câu trả lời của mình không có thuộc tính ứng dụng trong lớp. Một thuộc tính không thuộc về một lớp trừ khi chúng ta đính kèm nó bằng cách sử dụng self.attribute_name = value hoặc định nghĩa nó trước các phương thức bên trong lớp không ở bên ngoài. – codecool

Trả lời

2

Kiểm tra đơn vị của bạn không thể tìm thấy thuộc tính "ứng dụng" vì MyApplication không có. Có một thuộc tính "ứng dụng" trong mô-đun mà MyApplication được định nghĩa. Nhưng đó là hai nơi riêng biệt.

Có lẽ hãy thử như sau:

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 

Ngoài ra, bạn cũng dường như có một "getApplication" phương pháp mà bạn không thực sự làm bất cứ điều gì với, nhưng tôi tưởng tượng rằng bạn đang sử dụng nó cho một cái gì đó. Có lẽ bạn thực sự muốn điều này trong thử nghiệm của bạn ...

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