2013-05-14 19 views
5

Flask'ta testlerle birlikte olmak istediğim küçük bir uygulamam var. Daha önce Django testlerini kullandım ve Flask'taki daha düşük seviyedeki işlevselliklerle uğraşıyorum.MongoEngine ile Flask'ta Test Suite

Benim testler şu anda şuna benzer:

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() 

Ben testi geçtiği ama veritabanına bir girdi eklemiş çünkü bu, yanlış olduğunu biliyoruz. Veritabanını kirletmeden bir Kullanıcı yaratmayı nasıl test etmeliyim? Burada app.config['TESTING']'un bir önemi olduğunu varsaymıştım.

Herhangi bir yardım çok takdir edilmektedir.

cevap

7

Bildiğim iki yaklaşım vardır:

1. Ayrı Testi Veritabanı

Bu Django unittesting için otomatik olarak yapar şeydir. Her test çalışmasından önce ve sonra temizlediği test için ayrı bir veritabanı kullanır. Böyle bir şeyi manuel olarak uygulayabilirsiniz.

2. alaycı Bu en durumlar için daha çok tercih edilen yöntemdir veritabanını

kullanarak aslında önlemek için. Çeşitli işlevleri simüle etmek için alay kullanırsınız, böylece testler gerçek bir veritabanında gerçekte bilgi yaratmaz/düzenleyemez/silemez. Bu, birden çok nedenden ötürü, özellikle de ünite testlerinizin performansı/hızı için daha iyidir.

+1

Harika. Bu sonuca varmaktaydım - 'sihir' sağlayan Djago'ya alıştım. Flask için orada iyi alaycı kütüphaneler var mı? –

+0

Herhangi bir python alay kitaplığı kullanabilirsiniz (örneğin, 'mock'), ancak veritabanı için zaten '' mongoengine' veya 'pymongo' alay eden bir paket bulmak daha iyi. Başka bir soruya bakın: http://stackoverflow.com/a/16017141/880326. – tbicr

+2

Daha iyi bir çözüm için mi? Şaka yapıyor olmalısın. Atama, API çağrılarını engellemek, testi hızlandırmak (tek katmanlı test) ve tonlarca şey yapmak için harikadır, ancak DB'de bir şeyler oluşturmamak için kullanmak, bir araba üzerinde oturmadan test sürüşü yapmak gibidir. Hayır. Çözüm 1 bu durumda doğru olanı. –