2012-05-10 16 views
0

これはおそらく非常に簡単ですが、依然としてsqlalchemyを取り上げているため、答えが見つからないようです。私は、基本モジュールのsometable.pysqlalchemy:同じクラスの複数のベース

import config 
class SomeTable(config.Base): 
    __tablename__ = 'bla' 
    def __init__(self, name): 
     self.name = name 

を持っている今、私は、このモジュールのテストを書きたい:基本的には、いくつかのテストの行を追加しSomeTableの他の機能を使用して、いくつかの計算を行うと、結果を確認してください。しかし、私はメインデータベースでこれらの操作をしたくありません。どのように私はsometableモジュールで定義されたクラスに別のBaseオブジェクトを渡すことができますか?またはこれを達成するためのよりよい方法がありますか?

私test_sometable.pyは現在、次のようになります。

import sometable, config 
class TestSomeTable(unittest.TestCase): 

    def setUp(self): 
     engine = create_engine('sqlite:///:memory:') 
     self.Base = declarative_base(config.Base.metadata, engine) 

    def test_some_functionality(self): 
     tbl = sometable.SomeTable('name1') 
     # if i create a session and add a row here, 
     # it will add it to my main database, rather than the in-memory one 

答えて

1

SomeTableはベースとして、あなたがあなたのテストクラスに新しいBaseを定義することは重要ではありませんconfig.Base使用しています。あなたのエンティティは、それが別の基盤であるべきことをどのように知っていると思われますか?

configを最初にインポートした場合は、config.Baseを使用するベースに置き換えてください。そのインポート後にのみ、sometableをインポートしてください。それ以外の場合は、単体テストの実行時に本番構成ではなくテスト構成を使用する別の方法を見つける必要があります。

+0

現在、エンティティは私が定義した新しいベースを使用する方法がありません。これは、正確に私が探しているコードのビットです。 テストを実行するために別の設定を使用することは悪い考えではありませんが、同じオブジェクトの複数のインスタンスが異なるデータベースを指しているという自然な方法があると思います。 – ludaavics

+0

は、config.TestBaseと同様にconfig.TESTフラグを追加することになりました。実際のファイルには 、config.TESTはfalseに設定されています。 私のテストのsetUp()に、私はconfig.TESTをTrueに設定し、sometableモジュールをリロードします。 tearDown()では、config.TESTをfalseに、TestBaseをNoneに戻しました。 – ludaavics

関連する問題