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"?
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