4

初期化されたSQLAlchemyを備えたアプリがあります:

config_name = os.getenv('FLASK_CONFIG') or 'default'
app = Flask(__name__)
db = SQLAlchemy(app)
db.init_app(app)

私が取り組んでいるビューは、すべてのユーザーをjson形式で返すだけです:

@app.route('/users', methods=['GET'])
def users():
    users = db.session.query(User)

    output = {'users': [user.to_json() for user in users]}
    return jsonify(**output)

そして私のテスト:

class UserViewTest(BaseTestCase, CreateUserMixin):
    def test_users(self):
        user1 = self._make_user() # defined in the above mixin
        user2 = self._make_user()
        user2.email = 'hello@abc.com'
        user2.username = 'hello@abc.com'
        db.session.add_all([user1, user2])
        db.session.flush()
        response = app.test_client().get('/users')

私は自分のテストを実行しますFLASK_CONFIG=testing nosetests(そして私がチェックしたところ、app.testingはtrueに設定されています)。

これを私の psql データベースに対して実行すると、データベースに追加したこれらのユーザーが保存されていることがわかりました!

triller_social_test=# SELECT username FROM users;
   username    
---------------
 foobar
 hello@abc.com
(2 rows)

これが起こらないようにするにはどうすればよいですか? 何もしないように db.session.commit() を上書きしようとしましたが、ビューを呼び出すとデータベースがロールバックします。を使用する代わりの方法はありtest_client()ますか? jsonify応答以外の場所にデータを返すことができないため、メソッドを直接呼び出すことはできません。

更新:ここに私の一時的な(?)解決策があります:

def json_response_converter(dict_):
    if config_name == 'testing':
        return dict_
    else:
        return jsonify(**dict_)

これで、テストで jsonify() を使用する必要がなくなりました

4

1 に答える 1

1

andtest_clientと一緒に使用するのが正しいアプローチです。jsonify についてどのような懸念がありますか? 主な質問との関連がわかりません。flushrollback

おそらく、ティアダウン ロールバックが思いどおりに呼び出されていない可能性があります。インライン ロールバックを含めると、テストの一部として状態がクリアであることを確認できます。

このアプローチが機能することを示す要点を次に示します。https://gist.github.com/bhtucker/58a90e59265a0994bf42a23921d69718

ツールと適切な python 依存関係bash setup_and_test.shを備えた環境で簡単に実行できるはずです。psql

于 2016-04-01T20:50:19.087 に答える