2013-05-14 36 views
5

Tôi có một ứng dụng nhỏ trong Flask mà tôi muốn đi kèm với các bài kiểm tra. Tôi đã sử dụng các bài kiểm tra Django trước đây, và tôi chỉ bắt tay với các chức năng cấp thấp hơn trong Flask.Test Suite trong Flask với MongoEngine

xét nghiệm của tôi hiện trông như thế này:

import unittest 
from config import app 
from mongoengine import connect 
from my_app.models import User 

class TestCase(unittest.TestCase): 

    def setUp(self): 
     app.config['TESTING'] = True 
     app.config["MONGODB_DB"] = 'xxx' 
     connect(
      'xxx', 
      username='heroku', 
      password='xxx', 
      host='xxx', 
      port=xxx 
     ) 
     self.app = app.test_client() 

    def tearDown(self): 
     pass 

    def test_create_user(self): 
     u = User(username='john', email='[email protected]') 
     u.save() 

Tôi biết rằng điều này là sai, bởi vì vượt qua bài kiểm tra nhưng tôi đã thêm một mục nhập vào cơ sở dữ liệu. Làm thế nào tôi nên kiểm tra việc tạo ra một người dùng mà không gây ô nhiễm cơ sở dữ liệu? Tôi đã giả định rằng app.config['TESTING'] có một số ý nghĩa ở đây.

Bất kỳ giúp nhiều đánh giá cao.

Trả lời

7

Có hai phương pháp tôi biết:

1. Kiểm tra riêng biệt Cơ sở dữ liệu

Đây là điều mà Django không tự động cho unittesting. Nó chỉ đơn giản là sử dụng một cơ sở dữ liệu riêng biệt để thử nghiệm mà nó xóa trước và sau mỗi lần chạy thử nghiệm. Bạn có thể thực hiện một cái gì đó như thế này bằng tay.

2. Sử dụng Mocking để tránh thực sự sử dụng cơ sở dữ liệu

Đây là phương pháp ưa thích hơn đối với hầu hết các tình huống. Bạn sử dụng chế nhạo để mô phỏng các chức năng khác nhau để các bài kiểm tra không thực sự tạo/chỉnh sửa/xóa thông tin trong cơ sở dữ liệu thực. Điều này là tốt hơn cho nhiều lý do, đáng chú ý nhất cho hiệu suất/tốc độ của các bài kiểm tra đơn vị của bạn.

+1

Tuyệt vời. Tôi đã đi đến kết luận này - tôi đã từng được sử dụng để Djago cung cấp 'ma thuật'. Có bất kỳ thư viện mocking tốt ra khỏi đó cho Flask? –

+0

Bạn có thể sử dụng bất kỳ thư viện mô phỏng python nào (ví dụ 'mock'), nhưng đối với cơ sở dữ liệu, hãy tìm một số gói đã chế nhạo' mongoengine' hoặc 'pymongo'. Xem xét một câu hỏi khác: http://stackoverflow.com/a/16017141/880326. – tbicr

+2

Mocking một giải pháp tốt hơn? Bạn phải nói đùa. Mocking là tuyệt vời để tránh các cuộc gọi API, tăng tốc độ kiểm tra (thử nghiệm một lớp) và tấn công cụ, nhưng việc sử dụng nó để tránh tạo nội dung trong DB giống như kiểm tra lái xe mà không cần ngồi trên đó. Số 1 Giải pháp đúng trong trường hợp này. –