12

これbefore_filterに非常によく似た、でデータベース接続を設定しているフラスコアプリケーションがあります。

@app.before_request
def before_request():
    g.db = connect_db()

今:私はいくつかの単体テストを書いていますが、それらがデータベースにヒットすることを望んでいません。g.db期待値を設定できるモック オブジェクトに置き換えたいと考えています。

ここapp.test_client()のフラスコのドキュメントに示されているように、私のテストでは を使用しています。テストの例は次のようになります

def test(self):
    response = app.test_client().post('/endpoint', data={..})
    self.assertEqual(response.status_code, 200)
    ...

テストは機能してパスしますが、データベースにアクセスしています。前述のとおり、db アクセスをモック オブジェクトに置き換えたいと考えています。test_clientオブジェクトにアクセスしgたり、before_filters を変更したりする方法がわかりません。

4

1 に答える 1

27

これは動作します

test_app.py

from flask import Flask, g

app = Flask(__name__)

def connect_db():
    print 'I ended up inside the actual function'
    return object()

@app.before_request
def before_request():
    g.db = connect_db()


@app.route('/')
def root():
    return 'Hello, World'

test.py

from mock import patch
import unittest

from test_app import app


def not_a_db_hit():
    print 'I did not hit the db'

class FlaskTest(unittest.TestCase):

    @patch('test_app.connect_db')
    def test_root(self, mock_connect_db):
        mock_connect_db.side_effect = not_a_db_hit
        response = app.test_client().get('/')
        self.assertEqual(response.status_code, 200)

if __name__ == '__main__':
    unittest.main()

したがって、これは「実際の関数内に到達した」ではなく、「dbをヒットしなかった」と出力します。明らかに、モックを実際のユースケースに適合させる必要があります。

于 2013-01-03T19:52:44.250 に答える