3

私は次のようなモジュールを持っています:

'''example.py'''
from some.module import Session

def init_system():
    var_one = Session.query(SQLAModelA).all()
    var_two = [(x.attr_B_a, x) for x in Session.query(SQLAModelB).all()]

    for value in var_one:
        something = value.attr_A_a + value.attr_A_c
    # Will do something with var_two etc (which has different attributes)
    something_else = [x.attr_B * 2 for x in var_two]
    return result

セッションとは、DBと通信するSQLAlchemyセッションハンドラーを指します。テストの目的で、Sessionオブジェクト(または単にSessionオブジェクト?)のクエリメソッドをモックできる必要がありinit_systemます。これにより、実際にデータベースと対話せずにテストできます。これを行うためにMockフレームワークを使用するにはどうすればよいですか?

本当に私を困惑させるのは、メソッドをモックした場合、query()渡されるクラスに依存するすべてのメソッドの出力を変更するにはどうすればよいですquery()か?

私は私が次の線に沿って何かをすることができることを望んでいます:

def test_init_numbers():
    import
    my_mock_object = MagicMock()
    with patch('some.module.Session.query', my_mock_object):
        result = example.init_system()
        assert result == ['expected', 'result']

ただし、正しくmy_mock_object模倣するために何をする必要があるのか​​わかりません。イテレータを返すメソッドquery()を実装する必要があると思います。all()そして、返されたイテレータに入れるモックオブジェクトをさらに作成して、適切な属性の値があることを確認できることを知っています。例:

var_one_element_mock = MagicMock(spec=SQLAModelA)
var_one_element_mock.attr_A_a = 12

var_two_element_mock = MagicMock(spec=SQLAModelB)
var_one_element_mock.attr_B = 100

そしてもちろん、MagicMockinit_system関数で使用できるオブジェクトのさまざまなバージョンの反復可能オブジェクトを作成できます(例:for value in var_one行内)。

しかし、モックされたすべてのオブジェクトをつなぎ合わせる方法がわからないのでSession.query、クラスが渡されることを考慮してメソッドをモックアウトすることができます。これは、返される反復可能オブジェクトの内容に影響します。

ありがとう!

4

1 に答える 1

0

これについてまだ助けが必要かどうかはわかりませんが、MagicMock オブジェクトが呼び出されたときに何が起こるかを制御したい場合は、side_effect 引数として関数を渡すことができます。このようなものがうまくいくはずです。

def test_init_numbers():
    import
    my_mock_object = MagicMock()
    def return_iterator():
      ## create and return your iterator here

    my_mock_object.all = MagicMock(side_effect=return_iterator)
    with patch('some.module.Session.query', my_mock_object):
        result = example.init_system()
        assert result == ['expected', 'result']
于 2012-04-12T03:19:17.140 に答える