2013-05-14 17 views
5

私はテストに付随するFlaskの小さなアプリケーションを持っています。以前はDjangoのテストを使用していましたが、Flaskの下位レベルの機能を把握しています。テストスイートwith Flask with MongoEngine

私のテストは、現在、次のようになります。

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

テストに合格したので、私は、これは間違っていることを知っているが、私は、データベースへのエントリが追加されています。データベースを汚染することなくユーザーの作成をテストするにはどうすればよいですか?私はapp.config['TESTING']がここでいくつかの重要性を持っていると仮定していました。

ご迷惑をおかけして申し訳ございません。

答えて

7

は、私の知っている二つのアプローチがあります。

1.別のテストデータベース

これは、Djangoが単体テストのために自動的に行いますものです。テストを行うたびに、テスト実行の前後にクリアされるテスト用に別個のデータベースを使用するだけです。手動でこれを手動で実装することもできます。

2.モッキングは、これはほとんどの状況のた​​めのより好ましい方法であるデータベース

を使用して、実際に回避します。実際のデータベースで実際にテストが作成/編集/削除されないように、さまざまな関数をシミュレートするために模擬を使用します。これは複数の理由、特にユニットテストのパフォーマンス/スピードに優れています。

+1

私はこの結論に至りました - 私はDjagoが「魔法」を提供するのに慣れてきました。フラスコのためにそこに良い模倣の図書館がありますか? –

+0

あなたは任意のpythonモックライブラリ(例えば 'mock')を使うことができますが、データベースには' mongoengine'や 'pymongo'をすでに嘲笑しているパッケージがあります。別の質問を見てください:http://stackoverflow.com/a/16017141/880326。 – tbicr

+2

もっと良い解決策を模索しますか?冗談じゃないわ。 Mockingは、API呼び出しを避け、テスト(単層テスト)や膨大な量のテストを高速化するのは素晴らしいことですが、DBにデータを作成しないようにすることは、テスト運転のようなものです。いいえ、解決策1はこの場合正しいものです。 –