2016-04-07 17 views
1

だから私はイベントリスナーを持っているSQLAlchemyのモデルがあります:Pythonの:(mock.unittestを使用して)SQLAlchemyのイベントハンドラを模擬する方法

class User(db.Model): 
    id = db.Column(db.Integer, primary_key=True) 

@event.listens_for(User, "after_insert") 
@event.listens_for(User, "after_update") 
def do_something(mapper, connection, self): 
    foo = SomeClass(self) 
    foo.do_something_to_database() 

をそして、私はモデルを挿入/更新する必要があるユニットテストを持っていますそれはまだ呼ばれているdo_something機能のように思えるし、成功裏に嘲笑されていないため

@patch('my_package.user.do_something') 
def test_user(mock_do_something): 
    user = User() # This insert will invoke 'do_something' via the event listener. 
    assertSomething(user) 

しかし、私のテストは失敗します。私はどのようにしてhereのパッチを読んでみましたか(この機能は正しいと思いますか?)、SQLAlchemyソースコードhereを見て、適切なモジュールを見つけました(@patch('sqlalchemy.event.registrat._listen_fn')のようなものですが)。

誰もこれまでにこれまでに遭遇したことはありますか?

答えて

1

をテストすることがわかりました。

ような何か:

class SADeListener(object): 
    def __init__(self, class_, event, callable_): 
     self.class_ = class_ 
     self.event = event 
     self.callable_ = callable_ 

    def __enter__(self): 
     sqlalchemy.event.remove(self.class_, self.event, self.callable_) 

    def __exit__(self, type_, value, tb): 
     sqlalchemy.event.listen(self.class_, self.event, self.callable_) 

そしてそれを使用します。

with SADeListener(User, "after_insert", do_something), 
    SADeListener(User, "after_update", do_something): 
    .. code ... 
0

私はユニットのイベントを無効にする回避策はおそらくリスナーを削除し、トリックを行うことができ、終了時に再度追加コンテキストマネージャクラスを持つ

import sqlalchemy as sa 
from unittest import TestCase 
from mypackage.models.user import User 

class TestUser(TestCase): 
    def setUp(self): 
     super(TestUser, self).setUp() 
     sa.event.remove(User, "after_insert", do_something) 
     sa.event.remove(User, "after_update", do_something) 

    def tearDown(self): 
     super(TestUser, self).tearDown() 
     sa.event.listen(User, "after_insert", do_something) 
     sa.event.listen(User, "after_update", do_something) 

    @patch('my_package.user.do_something') 
    def test_user(mock_do_something): 
     user = User() 
     assertSomething(user) 
関連する問題